Doctrine orm “听众”;SoftDeleteableListener“;未添加到EventManager

Doctrine orm “听众”;SoftDeleteableListener“;未添加到EventManager,doctrine-orm,soft-delete,symfony-2.1,Doctrine Orm,Soft Delete,Symfony 2.1,我在运行Symfony 2.1.0-DEV的项目上测试了softdeletable扩展 我的config.yml配置如下: orm: auto_generate_proxy_classes: %kernel.debug% auto_mapping: true filters: softdeleteable: class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter

我在运行Symfony 2.1.0-DEV的项目上测试了
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”)
*/
公共职能行动(){
$em=$this->getDoctrine()->getEntityManager();
$article=$em->find('article',3);
$em->remove($article);
$em->flush();
死(‘ok’);
}
当我运行代码时,它总是显示异常:
Listener“SoftDeleteableListener”未添加到EventManager

经过一段时间的调试,我发现类
SoftDeleteableFilter
具有函数
getListener()

受保护的函数getListener() { 如果($this->listener==null){ $em=$this->getEntityManager(); $evm=$em->getEventManager(); foreach($evm->getListeners()作为$listeners){ foreach($listeners作为$listener){ if($SoftDeleteableListener的侦听器实例){ $this->listener=$listener; 破口2; } } } 如果($this->listener==null){ 抛出new\RuntimeException('Listener“SoftDeleteableListener”未添加到EventManager!'); } } 返回$this->listener; }
但是,
$listeners
属性没有
SoftDeleteableListener
项,但它有其他侦听器,例如

  • Gedmo\Tree\TreeListener
  • Gedmo\Sortable\SortableListener
  • Gedmo\Sluggable\SluggableListener
  • Gedmo\Loggable\LoggableListener
  • Gedmo\Timestable\TimestableListener
  • Gedmo\translateable\translateableListener
它们是从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 ] ]         
# app/config.yml
stof_doctrine_extensions:
    default_locale: %locale%
    orm:
        default:
            softdeleteable: true
因此,我尝试添加以下内容:

gedmo.listener.softdeleteable:
    class: Gedmo\SoftDeleteable\SoftDeleteableListener
    tags:
        - { name: doctrine.event_subscriber, connection: default }
    calls:
        - [ setAnnotationReader, [ @annotation_reader ] ]
但它仍然显示,
Listener“SoftDeleteableListener”未添加到EventManager


我需要添加哪个SoftDeleteableListener实例的侦听器吗?

很抱歉我的疏忽,因为我在文件底部的config.yml文件中过度编写了配置使用:

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

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

无法解决问题,因为答案不清楚

要将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' ] ]
顺便说一句,可以找到帮助我的更完整的讨论:

参见:

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

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 ] ]         
# app/config.yml
stof_doctrine_extensions:
    default_locale: %locale%
    orm:
        default:
            softdeleteable: true
如果您在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
services:   
    ..........
    ..........
    gedmo.listener.softdeleteable:
        class: Gedmo\SoftDeleteable\SoftDeleteableListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
        calls:
            - [ setAnnotationReader, [ '@annotation_reader' ] ]
然后将新服务添加到
config.services.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
services:   
    ..........
    ..........
    gedmo.listener.softdeleteable:
        class: Gedmo\SoftDeleteable\SoftDeleteableListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
        calls:
            - [ setAnnotationReader, [ '@annotation_reader' ] ]
最后将注释添加到
实体

use Gedmo\Mapping\Annotation as Gedmo;

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

就是这样

我得到了“未捕获的Symfony\Component\Yaml\Exception\ParseException:保留的指示符“@”不能开始普通的标量;你需要引用标量”,我不得不引用:[“@annotation\u reader”]非常感谢,你救了一天好男人,谢谢