我是Symfony上的事件监听器的新手,我希望找到一种在持久保存特定实体(即用户)时触发事件的好方法。
我搜索了文档,虽然我发现对onKernel事件的引用,但我无法为我需要的东西创建一个监听器。你能指点我正确的方向还是举个例子?
答案 0 :(得分:3)
这是有充分记录的here。
您基本上创建了一个实现Doctrine\Common\EventSubscriber
的类,然后您有一个方法getSubscribedEvents()
,您可以在其中添加要触发它的事件,它看起来像:
public function getSubscribedEvents()
{
return ['postPersist'];
}
public function postPersist(LifecycleEventArgs $args)
{
$object = $args->getEntity();
if (!$object instanceof User) {
return;
}
$this->doSomething($object);
}
答案 1 :(得分:1)
您应该从EventSubscriber
类实现,并且可以使用以下事件:
prePersist
,preUpdate
,postPersist
,postUpdate
示例:
ApplicationBundle / EventSubscriber / EntitySubscriber.php
namespace App\ApplicationBundle\EventSubscriber;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
/**
* Class EntitySubscriber
*/
class EntitySubscriber implements EventSubscriber
{
/**
* Get subscribed events
*
* @return array
*/
public function getSubscribedEvents()
{
return [
'preUpdate',
];
}
/**
* @param LifecycleEventArgs $args
*/
public function preUpdate(LifecycleEventArgs $args)
{
/** @var PreUpdateEventArgs $args */
$entity = $args->getEntity();
$changes = $args->getEntityChangeSet();
dump($changes);
}
}
答案 2 :(得分:0)
为了完整性:
如果您只需要处理 1 个实体类(例如 prePersist
)上的 1 个生命周期事件(例如 User
),您可以使用 https://symfony.com/doc/4.4/doctrine/events.html 中记录的 4 个选项中的任何一个,但是可能更合适的是生命周期回调或实体监听器。
生命周期回调示例:
在您的实体中:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks <-- DO NOT FORGET TO ADD THIS
*/
class User
{
/* properties, getters/setters... */
/**
* @ORM\PrePersist
*/
public function onPrePersist(): void
{
/* write your logic here */
}
}
(请注意,您不能注入服务)。
实体监听器示例:
(1) 新类:
namespace App\EventListener;
use App\Entity\User;
use Doctrine\Persistence\Event\LifecycleEventArgs;
class UserPrePersistListener
{
public function __construct(/* you can inject services here */)
{
/* ... */
}
public function __invoke(User $user, LifecycleEventArgs $event): void
{
/* write your logic here */
}
}
(2) 配置:
services:
# ...
App\EventListener\UserPrePersistListener:
tags: [{ name: doctrine.orm.entity_listener, entity: App\Entity\User, event: prePersist }]
如果您需要处理 2 个以上实体类的 1 个生命周期事件,请使用生命周期侦听器。
如果您需要处理 1 个实体类上的 2 个以上生命周期事件,或 2 个以上实体类上的 2 个以上生命周期事件,请使用 生命周期订阅者。