实体侦听器 preUpdate prePersist 未调用



我经常使用教义事件侦听器,但这是我的第一个实体侦听器。

class ReportListener
{
/** @ORMPreUpdate */
public function preUpdate(Report $report, PreUpdateEventArgs $args)
{
$report->updatedAt = new DateTime();
$this->logger->debug('UpdatedAt ' . $report->updatedAt->format('c')); // I get *NO* log !!!
$this->entityManager->getUnitOfWork()->recomputeSingleEntityChangeSet(
$this->entityManager->getClassMetadata(Report::class), $report); // is this necessary?
}
public function prePersist(Report $report, LifecycleEventArgs $args)
{
$report->updatedAt = new DateTime();
$this->logger->debug('UpdatedAt ' . $report->updatedAt->format('c')); // not called!
$this->entityManager->getUnitOfWork()->recomputeSingleEntityChangeSet(
$this->entityManager->getClassMetadata(Report::class), $report); // do I need that?
}
public function postUpdate(Report $report, LifecycleEventArgs $args)
{
// IS CALLED !!!!
}
public function postPersist(Report $report, LifecycleEventArgs $args)
{
// IS CALLED !!!
}
}

#

因此,它应该只更新更新的时间戳... 我的实体是标准的:

@ORMTable(name="report")
* @ORMEntity()
* @ORMEntityListeners({"AppEventListenerReportListener"})
*/
class Report {...}

我在symfony上下文中使用它,我什至明确地注册了每个事件,但没有运气。

report_listener:
class: AppEventListenerReportListener
tags:
- { name: doctrine.orm.entity_listener, event: preUpdate}
- { name: doctrine.orm.entity_listener, event: prePersist}
- { name: doctrine.orm.entity_listener, event: postUpdate}
- { name: doctrine.orm.entity_listener, event: postPersist}

另一个问题是我是否真的需要重新计算预持久和预更新中的更改集......

首先,由于您没有在prePersist/preUpdate之前更新实体,因此无需重新计算它。

其次,您不需要服务侦听器的注释。有关详细信息,请阅读此文档。我认为你应该做什么很清楚:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html#listening-and-subscribing-to-lifecycle-events

最近我遇到了这样的问题,在实现一个新的实体侦听器后,我的 symfony 2 应用程序不会调用它,这困扰了我大约一个小时左右,这一切都是在实现对实体侦听器的更改后首先清除教义元数据,即使在我的开发环境中也是如此。

app/console doctrine:cache:clear-metadata

在我的开发环境中,即使在实现了已经存在的实体侦听器类中不存在的新函数之后,我也必须清除元数据。 根据我的经验,当函数使用默认名称(如 postLoad - preFlush - preUpdate - postUpdate 等)时,您不需要实体侦听器类中的注释。如果实体侦听器类需要加载一些服务,则像 bellow 这样的服务声明就足够了。

app.entity_listener.check_cif_changes:
class: AppMainBundleEventListenerCheckForCifChangesListener
arguments:
- '@services.send_mail_helper'
tags:
- {name: doctrine.orm.entity_listener, lazy: true}

还有我记录的有关实体侦听器的更多信息:

  • 创建实体时的事件顺序:预持久 - 预刷新 - 后持久
  • 实体上的事件顺序 更新:加载后 - 刷新前 - 更新前 - 更新后
  • 可以安全使用刷新的事件:持久后 - 更新后

清除元数据命令在symfony 3+中更改

binconsole doctrine:cache:clear-metadata

相关内容

  • 没有找到相关文章

最新更新