2012-07-02 15 views
11

this exampleに続き、私のプロジェクトでSymfony 2.1.0-DEVを実行しているsoftdeletableの拡張機能をテストしました。Listener "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 \ Loggable \ LoggableListener
  • Gedmo \ Timestampable \ TimestampableListener
  • Gedmo \翻訳可能\ TranslatableListener loadClassMetadataから生成され

。だから私は、以下を追加しようとしました

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 ] ]   

:私はそれが私のdoctrine_extensions.ymlサービスリスナーから生成するかもしれないと思う

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

不明な回答が原因で問題を解決できませんでした。

が私を助け、あなたの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 ] ] 

、より完全な議論に以下の行を追加するには、プロジェクトにsoftdeletable動作を追加するには、見つけることができます:https://github.com/Atlantic18/DoctrineExtensions/issues/380

+0

githubの問題へのリンクはもう – mandark

+1

が@mandark私が得た「予約されたインジケータをキャッチされないのSymfony \コンポーネント\ YAML \例外の\はParseException』 – aur1mas

+0

を更新動作しません:YMLはsoftdeleteリスナーを有効にしますプレーンスカラー;スカラーを引用する必要がある」と、私は引用しなければならなかった:["@annotation_reader"] –

0

、私は、ファイルの使用の下部にconfig.ymlファイルの私の設定を上書きするので:

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

、適切に設定していなかった.....今の問題が修正されました。

関連する問題