2012-07-02 4 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 \ Tree \ TreeListener
  • Gedmo \ Сортируемый \ SortableListener
  • Gedmo \ Sluggable \ SluggableListener
  • Gedmo \ Loggable \ LoggableListener
  • Gedmo \ Timestampable \ TimestampableListener
  • Gedmo \ Translatable \ 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 ] ] 

Btw, более полное обсуждение, которое помогло мне, можно найти: https://github.com/Atlantic18/DoctrineExtensions/issues/380

+0

Ссылка на GitHub вопрос больше не работает – mandark

+1

@mandark обновленный – aur1mas

+0

я получил "Uncaught Symfony \ Component \ YAML \ Exception \ ParseException: Зарезервированные индикатор "@" не может начать простой скаляр, вам нужно процитировать скаляр », мне пришлось указать: [" @annotation_reader "] –

0

жаль моей невнимательности, потому что я переписал свою конфигурацию в файле config.yml в нижней части использования файла:

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

и не настроить должным образом ..... теперь проблема была решена ,