2011-12-31 2 views
0

나는 바보처럼 들릴지도 모르는 뭔가로 고민하고있다. 그러나Symfony2 리스너 클래스가로드되지 않습니까?

엔티티가 지속 된 후에 Lucene Search Index에 내용을 추가하는 수신기 클래스를 만들었다.

내 config.yml

:

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

내 파일이 SRC에/ripr/WfBundle/리스너

파일 이름이 SearchIndexer.php

이다는 네임 스페이스는 클래스 이름 SearchIndexer

한다 ripr \ WfBundle \ Listener

오류 메시지가 표시됩니다. S 라인

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

오류 :

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

이 해당 클래스가로드되지 않은 나에게 소리. 나는 내가 잘못한 곳으로 갈 수 없다.

나는 dev 캐시를 여러 번 플러시합니다.

이 정밀한 선은 고전적인 컨트롤러에서 호출 할 때 완벽하게 작동합니다. 당신이 컨테이너에 액세스 할 수 없기 때문에

내 클래스 코드가

<?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(); 






    } 

} 

답변

3

이 무슨 일을하는 데 도움

-------- -------- 편집 기본적으로 청취자 클래스 안에 있습니다. 그러나 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를 호출 할 수 있습니다 .

+0

나는이 문제를 해결하기 위해 어제 진절머리가 나는 해결책을 발견했습니다. 귀하의 의견은 올바른 방법을 보여주기에 정말 도움이되며 # 2는 의존성 주입에 대한 엄청난 관심을 가르쳐줍니다. 감사 – Matthieu