【问题标题】:Listener "SoftDeleteableListener" was not added to the EventManager侦听器“SoftDeleteableListener”未添加到 EventManager
【发布时间】:2012-07-02 22:23:00
【问题描述】:

我在运行 Symfony 2.1.0-DEV 的项目上按照 this example 测试 softdeletable 扩展。

我如下配置了我的 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\Sortable\SortableListener
  • Gedmo\Sluggable\SluggableListener
  • Gedmo\Loggable\LoggableListener
  • Gedmo\Timestampable\TimestampableListener
  • Gedmo\Translatable\TranslatableListener

从 loadClassMetadata 生成。我认为它可能从我的学说扩展.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 的哪个实例中添加监听器?

【问题讨论】:

    标签: doctrine-orm soft-delete symfony-2.1


    【解决方案1】:

    由于答案不清楚,无法解决问题。

    要将可软删除的行为添加到您的项目中,请将以下行添加到您的 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' ] ]
    

    顺便说一句,更完整的讨论,对我有帮助,可以找到:https://github.com/Atlantic18/DoctrineExtensions/issues/380

    【讨论】:

    • I got " Uncaught Symfony\Component\Yaml\Exception\ParseException: 保留的指示符 "@" 不能开始一个普通的标量;你需要引用标量",我必须引用:[ "@ annotation_reader"]
    • 非常感谢,您节省了一天
    【解决方案2】:

    见:https://github.com/stof/StofDoctrineExtensionsBundle/blob/master/Resources/doc/index.rst#activate-the-extensions-you-want

    将以下内容添加到您的 config.yml 以激活 softdelete 侦听器:

    # app/config.yml
    stof_doctrine_extensions:
        default_locale: %locale%
        orm:
            default:
                softdeleteable: true
    

    【讨论】:

      【解决方案3】:

      如果您在 api 平台上 这是我的config/packages/doctrine.yml

      doctrine:
          dbal:
              url: '%env(resolve:DATABASE_URL)%'
      
              # IMPORTANT: You MUST configure your server version,
              # either here or in the DATABASE_URL env var (see .env file)
              server_version: '12'
          orm:
              auto_generate_proxy_classes: true
              naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
              auto_mapping: true
              mappings:
                  App:
                      is_bundle: false
                      type: annotation
                      dir: '%kernel.project_dir%/src/Entity'
                      prefix: 'App\Entity'
                      alias: App
              filters:
                  softdeleteable:
                      class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                      enabled: true
      

      然后将新服务添加到config.services.yml

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

      最后将注解添加到entity

      use Gedmo\Mapping\Annotation as Gedmo;
      
      /**
      * @ApiResource()
      * @ORM\Entity(repositoryClass=StoreRepository::class)
      * @ORM\Table(name="trn_stores")
      * @Gedmo\SoftDeleteable(fieldName="deletedAt")
      */
      class Store ...
      

      就是这样

      【讨论】:

        【解决方案4】:

        抱歉我的粗心,因为我在文件使用底部的 config.yml 文件中覆盖了我的配置:

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

        并且没有正确配置.....现在问题已解决。

        【讨论】:

          猜你喜欢
          • 2011-08-16
          • 2013-02-17
          • 2011-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 2022-10-20
          • 2016-12-06
          相关资源
          最近更新 更多