2012-07-02 25 views
11

Tôi đã theo dõi this example để kiểm tra tiện ích mở rộng softdeletable trên dự án của tôi đang chạy Symfony 2.1.0-DEV.Trình nghe "SoftDeleteableListener" chưa được thêm vào EventManager

tôi cấu hình config.yml tôi như dưới đây:

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" 

controller action của tôi:

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

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

Khi tôi chạy mã, nó luôn luôn hiển thị các ngoại lệ: Listener "SoftDeleteableListener" was not added to the EventManager!

Sau khi một số dành thời gian với gỡ lỗi, tôi thấy rằng lớp SoftDeleteableFilter có chức năng 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; 
} 

Tuy nhiên $listeners tài sản không có SoftDeleteableListener mục, nhưng nó có nghe khác, chẳng hạn như

  • Gedmo \ Tree \ TreeListener
  • Gedmo \ Sortable \ SortableListener
  • Gedmo \ Sluggable \ SluggableListener
  • Gedmo \ Loggable \ LoggableListener
  • Gedmo \ Timestampable \ TimestampableListener
  • Gedmo \ Translatable \ TranslatableListener

Được tạo từ loadClassMetadata. Tôi nghĩ rằng nó có thể tạo ra từ tôi nghe dịch vụ 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 ] ]   

Vì vậy, tôi cố gắng thêm sau:

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

Nhưng nó vẫn cho thấy Listener "SoftDeleteableListener" was not added to the EventManager!

Tôi có cần phải thêm một người biết lắng nghe trường hợp của SoftDeleteableListener?

Trả lời

15

Không thể giải quyết được sự cố do câu trả lời không rõ ràng.

Để thêm hành vi softdeletable để dự án của bạn thêm dòng sau vào config.yml bạn

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, thảo luận đầy đủ hơn, giúp tôi, có thể được tìm thấy: https://github.com/Atlantic18/DoctrineExtensions/issues/380

+0

Liên kết với vấn đề github không hoạt động nữa – mandark

+1

@mandark cập nhật – aur1mas

+0

tôi "của router Symfony \ Component \ YAML \ Exception \ ParseException: Chỉ dành riêng "@" không thể bắt đầu một đồng bằng vô hướng; bạn cần báo giá vô hướng ", tôi phải báo giá: [" @annotation_reader "] –

0

xin lỗi về sự bất cẩn của tôi, bởi vì tôi ghi đè lên cấu hình của tôi trong tập tin config.yml ở dưới cùng của việc sử dụng file:

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

và không cấu hình đúng ..... bây giờ vấn đề đã được cố định .

Các vấn đề liên quan