Класс слушателя Symfony2 не загружается? - PullRequest
0 голосов
/ 31 декабря 2011

Я борюсь с чем-то, что может звучать глупо, но:

Я создал класс слушателя, который добавляет контент в поисковый индекс Lucene после сохранения сущности.

Мой config.yml:

services:
searchindexer.listener:
    class: ripr\WfBundle\Listener\SearchIndexer
    tags:
        - { name: doctrine.event_listener, event: postPersist }

Мой файл находится в src / ripr / WfBundle / Listener

Имя файла - SearchIndexer.php

Имя класса - SearchIndexer

Пространство имен ripr \ WfBundle \ Listener

Я получаю сообщение об ошибке в этой строке

$index = $this->get('ivory_lucene_search')->getIndex('identifier1');

ошибка:

Fatal error: Call to a member function get() on a non-object

Мне кажется, что класс не загружен. Я не могу понять, где я не прав.

Я сбрасываю кэш Dev, кратный раз.

Эта точная линия отлично работает, когда я называю ее внутри классического контроллера.

-------- Edited --------

Мой код класса, чтобы помочь

 <?php

namespace ripr\WfBundle\Listener;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Doctrine\ORM\Event\LifecycleEventArgs;
use ripr\WfBundle\Entity\Item;
use Ivory\LuceneSearchBundle\Model\Document;
use Ivory\LuceneSearchBundle\Model\Field;

/**
 * Search indexer.
 *
 * 
 */

class SearchIndexer extends Controller
 {

    /**
     * Index content
     *
     */
    public function postPersist (LifeCycleEventArgs $args) {

        //  $luceneSearch = $this->get('ivory_lucene_search');
        //  $luceneSearch->eraseIndex('identifier1');

            $entity = $args->getEntity();
            $entityManager = $args->getEntityManager();

            // perhaps you only want to act on some "Product" entity


                $index = $this->get('ivory_lucene_search')->getIndex('identifier1');
                $document = new Document();
                $document->addField(Field::text('titre', 'bille'));
                $document->addField(Field::text('texte', 'billou'));
            // Add your document to the index
                $index->addDocument($document);
                $index->commit();






    }

}

1 Ответ

3 голосов
/ 31 декабря 2011

Это происходит потому, что по умолчанию у вас нет доступа к контейнеру внутри вашего класса слушателя.Однако не просто расширяйте свой класс с Controller (который имеет доступ к контейнеру) или вставляйте весь контейнер.Вместо этого добавьте в него только те услуги, которые вам нужны:

config.yml:

services:
  searchindexer.listener:
    class: ripr\WfBundle\Listener\SearchIndexer
    arguments:
      luceneSearch: "@ivory_lucene_search"
    tags:
      - { name: doctrine.event_listener, event: postPersist }

SearchIndexer.php:

class SearchIndexer
{
    protected $luceneSearch;

    public function __constructor($luceneSearch)
    {
        $this->luceneSearch = $luceneSearch;
    }

    // ...

Затем везде, где вам нужно использовать люценпоиск внутри слушателя, вы можете просто позвонить $this->luceneSearch.

...