2012-07-02 10 views
11

我跟着this example測試softdeletable擴展上運行的Symfony 2.1.0-DEV我的項目。監聽器「SoftDeleteableListener」未添加到eventmanager進行

我配置我config.yml象下面這樣:

orm: 
    auto_generate_proxy_classes: %kernel.debug% 
    auto_mapping: true 
    filters: 
      softdeleteable: 
      class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter 
      enabled: true 
    mappings: 
     translatable: 
      type: annotation 
      alias: Gedmo 
      prefix: Gedmo\Translatable\Entity 
      # make sure vendor library location is correct 
      dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity" 
     loggable: 
      type: annotation 
      alias: Gedmo 
      prefix: Gedmo\Loggable\Entity 
      dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Entity" 
     tree: 
      type: annotation 
      alias: Gedmo 
      prefix: Gedmo\Tree\Entity 
      dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity" 

我的控制器動作:

/** 
* @Route("/del", name="del_article") 
*/ 
public function delAction() { 
    $em = $this->getDoctrine()->getEntityManager(); 

    $article = $em->find('Article', 3); 
    $em->remove($article); 
      $em->flush(); 
    die('ok'); 
} 

當我運行的代碼,它總是表現出異常:Listener "SoftDeleteableListener" was not added to the EventManager!

經過一番調試花費的時間,我發現類SoftDeleteableFilter具有功能getListener()

protected function getListener() 
{ 
    if ($this->listener === null) { 
     $em = $this->getEntityManager(); 
     $evm = $em->getEventManager(); 

     foreach ($evm->getListeners() as $listeners) { 
      foreach ($listeners as $listener) { 
       if ($listener instanceof SoftDeleteableListener) { 
        $this->listener = $listener; 

        break 2; 
       } 
      } 
     } 

     if ($this->listener === null) { 
      throw new \RuntimeException('Listener "SoftDeleteableListener" was not added to the EventManager!'); 
     } 
    } 

    return $this->listener; 
} 

然而$listeners屬性沒有SoftDeleteableListener項目,但它有其他的聽衆,如

  • Gedmo \樹\ TreeListener
  • Gedmo \可排序\ SortableListener
  • Gedmo \ Sluggable \ SluggableListener
  • Gedmo \可記錄的\ LoggableListener
  • Gedmo \ Timestampable \ TimestampableListener
  • Gedmo \可翻譯\ TranslatableListener

從loadClassMetadata生成哪個。我認爲它可能從我的doctrine_extensions.yml服務聽者產生:

services: 
    extension.listener: 
     class: Infinitz\UserBundle\Listener\DoctrineExtensionListener 
     calls: 
      - [ setContainer, [ @service_container ] ] 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onLateKernelRequest, priority: -10 } 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
    gedmo.listener.tree: 
     class: Gedmo\Tree\TreeListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ] 

    gedmo.listener.translatable: 
     class: Gedmo\Translatable\TranslatableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ] 
      - [ setDefaultLocale, [ %locale% ] ] 
      - [ setTranslationFallback, [ false ] ] 

    gedmo.listener.timestampable: 
     class: Gedmo\Timestampable\TimestampableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ] 

    gedmo.listener.sluggable: 
     class: Gedmo\Sluggable\SluggableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ] 

    gedmo.listener.sortable: 
     class: Gedmo\Sortable\SortableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ] 

    gedmo.listener.loggable: 
     class: Gedmo\Loggable\LoggableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ]   

所以我嘗試添加以下內容:

gedmo.listener.softdeleteable: 
    class: Gedmo\SoftDeleteable\SoftDeleteableListener 
    tags: 
     - { name: doctrine.event_subscriber, connection: default } 
    calls: 
     - [ setAnnotationReader, [ @annotation_reader ] ] 

但它仍然顯示Listener "SoftDeleteableListener" was not added to the EventManager!

我是否需要添加一個監聽器其中SoftDeleteableListener的實例?

回答

15

沒能解決,因爲尚不清楚答案的問題。

要softdeletable行爲添加到您的項目中添加以下行到您的config.yml

orm 
    .. 
    filters: 
    softdeleteable: 
     class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter 
     enabled: true 

services: 
    .. 
    gedmo.listener.softdeleteable: 
    class: Gedmo\SoftDeleteable\SoftDeleteableListener 
    tags: 
     - { name: doctrine.event_subscriber, connection: default } 
    calls: 
     - [ setAnnotationReader, [ @annotation_reader ] ] 

順便說一句,更全面的討論,這有助於我,可以發現:https://github.com/Atlantic18/DoctrineExtensions/issues/380

+0

鏈接到GitHub的問題不工作了 – mandark

+1

@mandark更新 – aur1mas

+0

我得到了「未捕獲的Symfony \分量\ YAML \異常\ ParseException的:預約指示‘@’無法啓動簡單的標量;你需要引用標量「,我不得不引用:[」@annotation_reader「] –

0

我的粗心很抱歉,因爲我重寫了我的config.yml配置文件在文件使用的底部:

services: 
    gedmo.listener.softdeleteable: 
     class:  Gedmo\SoftDeleteable\SoftDeleteableListener 

,並沒有正確地配置.....現在問題已得到修復。