【发布时间】:2017-06-19 22:25:29
【问题描述】:
在 Symfony 3 项目中,我有一个实体,我想审核某些属性的更改,因此我可以创建一个事件侦听器来存储它们。
实体大致如下:
- ReceivedEmail:agent 和 caseDetail 是我要审核的属性
- ReceivedEmailChange:previousAgent、currentAgent 和 previousCaseDetail 和 currentCaseDetail
EventListener 如下所示
/**
* @param OnFlushEventArgs $args
*/
public function onFlush(OnFlushEventArgs $args)
{
/** @var ReceivedEmail $entity */
$entityManager = $args->getEntityManager();
$unitOfWork = $entityManager->getUnitOfWork();
$updates = $unitOfWork->getScheduledEntityUpdates();
foreach ($updates as $entity) {
if ($entity instanceof ReceivedEmail) {
$changes = $unitOfWork->getEntityChangeSet($entity);
$this->receivedEmailChanges[] = $this->receivedEmailChangeManager
->getReceivedEmailChanges($entity, $changes);
}
}
}
public function postFlush(PostFlushEventArgs $args)
{
$em = $args->getEntityManager();
$i = 0;
foreach($this->receivedEmailChanges as $receivedEmailChange) {
$em->persist($receivedEmailChange);
unset($this->receivedEmailChanges[$i]);
$i++;
}
if ($i > 0) {
$em->flush();
}
}
问题是在 postFlush 方法上调用 $entityManager->flush() 会导致无限循环并出现此错误:
PHP 致命错误:达到“256”的最大函数嵌套级别, 中止!在 /var/www/sellbytel/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php 在第 187 行
所以我的问题是:如果可能的话,我如何从 EventListener 保存数据库中的更改?如果没有,是否有解决方法来创建此日志?
【问题讨论】:
-
恕我直言,您不能使用
onFlush事件来定义您需要处理的更改数组,而不是在postFlush处理这些更改后重新开始整个过程。您可以尝试使用preUpdate和postUpdate事件手动保存新旧值,而不是依赖 unitOfWork。 -
Loggable behaviour for Doctrine2 可能对你有用。
标签: php symfony doctrine-orm