Doctrine orm “听众”;SoftDeleteableListener“;未添加到EventManager
我在运行Symfony 2.1.0-DEV的项目上测试了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
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
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”]非常感谢,你救了一天好男人,谢谢