2011-12-31 98 views
0

我正在努力尋找一些聽起來很愚蠢的東西,但是:Symfony2監聽器類未加載?

我創建了一個偵聽器類,在實體持久化後向Lucene搜索索引添加內容。

我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; 
    } 

    // ... 

然後,你需要的地方使用監聽器裏Lucene搜索,你可以簡單地調用$this->luceneSearch

+0

昨天我發現了一個糟糕的解決方案,讓我擺脫這個問題。 您的評論#1真的有助於展示正確的方式來做到這一點,#2教會了我對依賴注入的巨大興趣。謝謝 – Matthieu 2012-01-01 10:09:25