【问题标题】:Doctrine LifecycleEventArgs return Gedmo\Loggable\Entity\LogEntryDoctrine LifecycleEventArgs 返回 Gedmo\Loggable\Entity\LogEntry
【发布时间】:2017-11-09 21:11:05
【问题描述】:

我正在尝试在 symfony 项目中处理教义事件, 按照 symfony 文档,我有这个代码

public function postPersist(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();


    if (!$entity instanceof Rubrique) {
        return;
    }

    $entityManager = $args->getEntityManager();
    // do some stuff
}

问题在于$entity 不是预期的对象Rubrique,而是Gedmo\Loggable\Entity\LogEntry 的一个实例,可能是因为RubriqueLoggable。如何访问我的实体以根据需要对其进行操作? 谢谢

【问题讨论】:

  • postPersist 应该被调用两次。一次用于Rubrique,一次用于LogEntry。你测试过吗?

标签: php entity-framework symfony doctrine-orm listener


【解决方案1】:

此事件侦听器是 "generic" one 而不是 doctrine entity listener

这意味着为每个持久实体引发事件:如果您在RubriqueLogEntry 之间存在关系,那么您可能只检查它们中的“第一个”是否为“postPersisted”。

如果您只需要针对那种实体的特定侦听器,请考虑使用学说实体侦听器(上面链接)。

此外请记住,“通用”侦听器将侦听(或将被订阅)每个实体的事件(因此,基本上,它可以被调用很多次),而学说实体侦听器则不会。

【讨论】:

  • 感谢您的回答,是的,我的所有实体都需要此事件。我的问题是如何检索我的实体,因为 getEntity() 方法返回 Gedmo\Loggable\Entity\LogEntry 而不是我的实体
  • @M.Smaïne 如前所述,getEntity 将返回不同类型的实体:取决于您验证实体是什么,如果 Rubrique 未刷新,请检查为什么未刷新或从其他对象中检索它。
  • 我给你更多细节也许你会再次帮助我。我开发了一个 saas 应用程序。每个实体都与实体客户端具有多对一的关系。我会在每次添加实体操作后设置客户端。这就是我使用 Doctrine 监听器的原因......我错了吗?
  • @M.Smaïne 这是一种这样做的方式。你永远不会从你的项目中删除教义,但如果你这样做了,你将失去所有这些行为。另一方面,如果你不想要这种“依赖”,你应该从头开始创建一些东西来实现这一点。这是一个艰难的选择;在我们的项目中,我们选择关注教义听众,因为项目已经“承诺”了教义
  • 非常感谢。我错了,我以为 getEntity 返回了刷新的对象实例,但它返回了类。所以我必须检索对象实例并设置客户端。感谢您的帮助@DonCallisto
猜你喜欢
  • 2013-04-20
  • 2015-01-21
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多