【发布时间】:2016-04-16 14:40:45
【问题描述】:
我有一个工作正常的 onFlush() 事件,但我需要做的是把它变成 preFlush() 或 preUpdate() 都可以接受。我做了 preFlush() 但由于某种原因它什么也没做。甚至没有错误。我错过了什么?
测试:我将exit 放入preFlush() 以查看它是否被调用。结果是:1 所以foreach() 永远不会运行!它是一个空数组。我还测试了 preUpdate() 以及其中的所有行都运行但没有插入数据。
public function preFlush(PreFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
echo '1';
foreach ($uow->getScheduledEntityUpdates() as $entity) {
echo '2';
if ($entity instanceof User) {
echo '3';
}
}
exit;
}
我在阅读documentation 后创建了它们。
service.yml
services:
entity.event_listener.user:
class: Site\FrontBundle\EventListener\Entity\UserListener
tags:
- { name: doctrine.event_listener, event: preUpdate }
- { name: doctrine.event_listener, event: onFlush }
- { name: doctrine.event_listener, event: preFlush }
处理 onFlush() 示例:
class UserListener
{
public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityUpdates() as $entity) {
if ($entity instanceof User) {
$userLog = new UserLog();
$userLog->setDescription($entity->getId() . ' being updated.');
$em->persist($userLog);
// Instead of $em->flush() cos we're already in flush process
$userLogMetadata = $em->getClassMetadata(get_class($userLog));
$uow->computeChangeSet($userLogMetadata, $userLog);
}
}
}
}
不工作的 preFlush() 示例:
class UserListener
{
public function preFlush(PreFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityUpdates() as $entity) {
if ($entity instanceof User) {
$userLog = new UserLog();
$userLog->setDescription($entity->getId() . ' being updated.');
$em->persist($userLog);
// Instead of $em->flush() cos we're already in flush process
$userLogMetadata = $em->getClassMetadata(get_class($userLog));
$uow->computeChangeSet($userLogMetadata, $userLog);
}
}
}
}
不工作的 preUpdate() 示例
class UserListener
{
public function preUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
if ($entity instanceof User) {
$userLog = new UserLog();
$userLog->setDescription($entity->getId() . ') been updated.');
$em = $args->getEntityManager();
$em->persist($userLog);
$userLogMetadata = $em->getClassMetadata(get_class($userLog));
$uow->computeChangeSet($userLogMetadata, $userLog);
}
}
}
【问题讨论】:
-
可以添加服务配置部分吗?
-
@devsheeep - 更新了帖子。
-
能否显示调用persist 和flush 方法的代码?
-
以控制器为例。例如。
$user = new User; $user->setName('abc'); $em->flush();没有持久化,因为这是 symfony2 的更新操作。 -
在 preFlush 中你应该使用 $args->getEntity() 而不是 $uow->getScheduledEntityUpdates()。
标签: symfony doctrine-orm