Symfony中的学说2:倾听来自特定实体的事件

Ton*_*nov 7 php events doctrine symfony

我有一个Doctrine Entity(新闻),我在听这个事件prePersist.为此,我使用该方法的事件监听器prePersist.

services.yml看起来像这样:

listener.entity.news:
    class: A\BBundle\Listeners\Entity\NewsListener
    tags:
        - { name: doctrine.event_listener, event: prePersist }
Run Code Online (Sandbox Code Playgroud)

这很好,一切正常.但文档指出,当persist()调用a 时,prePersist会生成一个事件.然后,因为我的配置状态NewsListener将捕获它并执行一些代码.在我捕获事件的方法中,我应该检查事件是否来自News实体.这是我想知道的地方,是否可以告诉Symfony为特定实体监听prePersist事件然后将其传递给我的听众?

目前(据我所知),每当doctrine产生一个prePersist事件时,都会通知所有侦听器.是不是更好地说哪些听众应该听哪个事件产生者,即使这应该是可选的,而不是通知所有人并让他们过滤他们需要的?

我希望我正确地问我的问题.

tho*_*rad 21

从Doctrine 2.4开始,这似乎得到了支持:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#entity-listeners

  • Doctrine ORM 2.4现在可以与Symfony一起使用:`doctrine-bundle 1.2 - > doctrine/orm:> = 2.2,<2.5-dev` (2认同)

Kor*_*lum 6

这是因为Doctrine 2.4具有Entity监听器功能.

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\EntityListeners({"AppBundle\EntityListener\PostListener"})
 */
class Post
{
}

namespace AppBundle\EntityListener;

use Doctrine\ORM\Mapping as ORM;

class PostListener
{
    public function preUpdate() {  }

    // or

    /** @ORM\PreUpdate */
    public function someOtherName() {  }
}
Run Code Online (Sandbox Code Playgroud)

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

是的,这可以从DoctrineBundle 1.3开始.您只需将实体侦听器注册为服务,并使用doctrine.orm.entity_listener标记对其进行标记.

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 }
Run Code Online (Sandbox Code Playgroud)

替代方法

从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 }
Run Code Online (Sandbox Code Playgroud)


Ste*_*nte 4

是否可以告诉 Symfony 监听特定实体的 prePersist 事件,然后将其传递给我的监听器?

不,这是不可能的。您的侦听器将为每个持久存在的实体触发。您需要instanceof在事件侦听器中进行检查,以确保您的代码仅针对特定实体运行。