在onFlush侦听器symfony中持久化
我试图在onFlush侦听器中保留一个实体。。。 这是我的代码:在onFlush侦听器symfony中持久化,symfony,listener,persist,Symfony,Listener,Persist,我试图在onFlush侦听器中保留一个实体。。。 这是我的代码: public function onFlush(OnFlushEventArgs $args){ $em = $args->getEntityManager(); $uow = $em->getUnitOfWork(); foreach ($uow->getScheduledEntityUpdates() as $entity) { switch (true)
public function onFlush(OnFlushEventArgs $args){
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityUpdates() as $entity) {
switch (true) {
case $entity instanceof Products:
$changeset = $uow->getEntityChangeSet($entity);
foreach($changeset as $column => $change) {
$logs = new Logs();
$logs->setDate(new DateTime());
$em->persist($logs);
$classMetadata = $em->getClassMetadata('BddBundle:Logs');
$uow->computeChangeSet($classMetadata, $logs);
}
}
}
break;
default : break;
}
}
}
问题是程序块(没有插入数据库的行)和PHP会说:
PHP致命错误:第653行的applis/vendor/doctrine/orm/lib/doctrine/orm/UnitOfWork.PHP中超过了300秒的最大执行时间,请参考:
有人有解决方案/方法吗
问候
编辑1:
将$em更改为$uow不会进行任何更改
$uow->persist($logs);
$classMetadata = $em->getClassMetadata('BddBundle:Logs');
$uow->computeChangeSet($classMetadata, $logs);
这将监视
User
实体上的更改,并向UserLog
实体中插入一些数据。根据你的需要调整它
use Doctrine\ORM\Event\OnFlushEventArgs;
class UserEntityListener
{
public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityUpdates() as $entity) {
if ($entity instanceof User) {
$userLog = new UserLog();
$userLog->setUserId($entity->getId());
$userLog->setMessage('onFlush - update at ' . date('d/m/Y H:i:s'));
$em->persist($userLog);
// Instead of $em->flush() because we are already in flush process
$uow->computeChangeSet($em->getClassMetadata(get_class($userLog)), $userLog);
}
}
}
}
计算更改集一次,而不是在循环内。这是疯狂,这不是斯巴达。为什么你添加了
switch(true)
呢?哈哈,这没有任何意义。可能是@emix的重复:我只是将switch改为if语句,现在我只保留了一次,但同样的问题……它不应该循环。我个人在我的应用程序中使用了完全相同的东西。您的应用程序中可能存在不同的问题。检查此项:您也可以检查此项以检查已更改的字段。我检查了这些链接,但我不知道为什么。。。它总是无限循环……如果您将实体
的每个实例替换为文档
,则此示例也适用于Doctrine的ODM。