2012-07-02 6 views
11

this example을 따라 Symfony 2.1.0-DEV를 실행하는 프로젝트에서 softdeletable 확장을 테스트했습니다. 리스너 "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" 

내 컨트롤러 액션 : 일부 후 Listener "SoftDeleteableListener" was not added to the EventManager!

: 나는이 코드를 실행하면

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

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

, 그것은 항상 예외를 보여 디버깅 시간을 보냈다. 클래스 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

Btw는
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 내가 가진"예약 된 표시를 catch되지 않은 심포니 \ 구성 요소 \ YAML \ 예외 \의 ParseException가 " – aur1mas

+0

업데이트 작동하지 않습니다 YML는 softdelete 수신기를 활성화합니다 일반 스칼라, 당신은 스칼라를 인용해야합니다. "라고 인용해야했습니다 : ["@annotation_reader "] –

0

, 내가 파일 사용의 하단에 config.yml 파일 내 구성을 덮어 때문에 :

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

제대로 구성하지 않은 ..... 이제 문제가 해결되었습니다 .

관련 문제