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开始,这似乎得到了支持:
这是因为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)
是否可以告诉 Symfony 监听特定实体的 prePersist 事件,然后将其传递给我的监听器?
不,这是不可能的。您的侦听器将为每个持久存在的实体触发。您需要instanceof
在事件侦听器中进行检查,以确保您的代码仅针对特定实体运行。