2012-07-02 25 views
11

Sprawdziłem rozszerzenie this example, aby przetestować rozszerzenie softdeletable w moim projekcie z Symfony 2.1.0-DEV.Listener "SoftDeleteableListener" nie został dodany do EventManager

skonfigurowałem moje config.yml jak poniżej:

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" 

mojego działania kontrolera:

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

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

Kiedy uruchomić kod, zawsze pokazać wyjątek: Listener "SoftDeleteableListener" was not added to the EventManager!

Po pewnym czas spędzony na debugowaniu, stwierdziłem, że klasa SoftDeleteableFilter ma funkcję 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; 
} 

Jednak $listeners nieruchomość ma SoftDeleteableListener pozycję, ale ma inne detektory, takie jak

  • Gedmo \ Drzewo \ TreeListener
  • Gedmo \ Sortable \ SortableListener
  • Gedmo \ Sluggable \ SluggableListener
  • Gedmo \ Loggable \ LoggableListener
  • Gedmo \ Timestampable \ TimestampableListener
  • Gedmo \ tłumaczyć \ TranslatableListener

które są generowane z loadClassMetadata. Myślę, że to może generować z mojego słuchacza usług 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 ] ]   

więc starałem się dodać następujące:

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

Ale to nadal pokazuje Listener "SoftDeleteableListener" was not added to the EventManager!

Czy muszę dodać detektor która instancja SoftDeleteableListener?

Odpowiedz

15

Nie można rozwiązać problemu z powodu niejasnej odpowiedzi.

Aby dodać softdeletable zachowanie do projektu dodać następujące linie do swojego 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, bardziej kompletny dyskusyjnym, który pomógł mi, można znaleźć: https://github.com/Atlantic18/DoctrineExtensions/issues/380

+0

Link do github problemu już nie działa – mandark

+1

@mandark aktualizowane – aur1mas

+0

mam "Uncaught Symfony \ Komponent \ yaml \ Wyjątek \ ParseException: zastrzeżonego wskaźnik "@" nie może rozpocząć zwykły skalar, musisz podać wartość skalarną ", musiałem zacytować: [" @annotation_reader "] –

0

przepraszam o mojej nieuwagi, bo nadpisałeś moją konfigurację w config.yml pliku na dole wykorzystaniem pliku:

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

i nie skonfigurować poprawnie ..... teraz problem został rozwiązany .

Powiązane problemy