Php Symfony 2中的原则:监听特定实体的事件

Php Symfony 2中的原则:监听特定实体的事件,php,events,doctrine,symfony,Php,Events,Doctrine,Symfony,我有一个条令实体(新闻),我收听事件prePersist。为此,我使用带有方法prePersist的事件侦听器 我的services.yml如下所示: listener.entity.news: class: A\BBundle\Listeners\Entity\NewsListener tags: - { name: doctrine.event_listener, event: prePersist } 这很好,一切正常。但是文档指出,当调用persist(

我有一个条令实体(新闻),我收听事件
prePersist
。为此,我使用带有方法
prePersist
的事件侦听器

我的
services.yml
如下所示:

listener.entity.news:
    class: A\BBundle\Listeners\Entity\NewsListener
    tags:
        - { name: doctrine.event_listener, event: prePersist }
这很好,一切正常。但是文档指出,当调用
persist()
时,会产生
prePersist
事件。然后,正如我的配置所述,
NewsListener
将捕获它并执行一些代码。在捕获事件的方法中,我应该检查事件是否来自
News
实体。这就是我想知道的地方,是否可以告诉Symfony监听某个特定实体的前置事件,然后将其传递给我的侦听器

目前(据我所知),每当条令产生
prePersist
事件时,都会通知所有侦听器。说哪些侦听器应该侦听哪些事件生成器,哪怕这是可选的,而不是通知所有人并让他们过滤他们需要的,不是更好吗

我希望我的问题问对了

有没有可能让Symfony听一段时间的预科活动 然后将它传递给我的侦听器


不,不可能。您的侦听器将为每个持久化的实体激发。您可以在事件侦听器中执行
instanceof
检查,以确保您的代码仅为特定实体运行。

根据您在侦听器中执行的操作,您可以在
新闻
实体中使用生命周期回调,并实现prePersist钩子


这样,侦听器将仅针对当前正在持久化的实例进行调用。

这似乎得到了原则2.4的支持:


这是可能的,因为第2.4条规定了该功能

如果我想向侦听器中注入依赖项,该怎么办?这可能吗

是的,从DoctrineBundle 1.3开始,这是可能的。您只需要将实体侦听器注册为服务&用标记对其进行标记

替代方法 因为DoctrineBundle 1.5可以,但是这个方法很简单。 此方法不需要将侦听器映射到
EntityListeners
注释

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Post
{
}

namespace AppBundle\EntityListener;

class PostListener
{
    public function __construct(SomeDependency $someDependency) {  }

    public function preUpdate() {  }

    public function someOtherName() {  }
}

services:
    app.post_listener:
        class: AppBundle\EntityListener\PostListener
        arguments: ["@app.some_dependency"]
        tags:
            - { name: doctrine.orm.entity_listener, entity: AppBundle\Entity\Post, event: preUpdate }
            # or
            - { name: doctrine.orm.entity_listener, entity: AppBundle\Entity\Post, event: preUpdate, method: someOtherName }

在简要查看了条令文档之后,我发现这些事件是由条令自己的事件调度器生成的,因此它实际上甚至不取决于symfony。谢谢。是的,但是我的
prePersist
需要访问服务,因为我不能将这样的实体注入到一个实体中,所以我必须将它移动到一个侦听器(不幸的是)。无论如何谢谢你!条令ORM 2.4现在可以与Symfony一起使用:
条令包1.2->条令/ORM:>=2.2,
class PostListener
{
    public function __construct(SomeDependency $someDependency) {  }
}

services:
    app.post_listener:
        class: AppBundle\EntityListener\PostListener
        arguments: ["@app.some_dependency"]
        tags:
            - { name: doctrine.orm.entity_listener }
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Post
{
}

namespace AppBundle\EntityListener;

class PostListener
{
    public function __construct(SomeDependency $someDependency) {  }

    public function preUpdate() {  }

    public function someOtherName() {  }
}

services:
    app.post_listener:
        class: AppBundle\EntityListener\PostListener
        arguments: ["@app.some_dependency"]
        tags:
            - { name: doctrine.orm.entity_listener, entity: AppBundle\Entity\Post, event: preUpdate }
            # or
            - { name: doctrine.orm.entity_listener, entity: AppBundle\Entity\Post, event: preUpdate, method: someOtherName }