为什么在Symfony Doctrine中使用PostPersist

时间:2016-12-04 04:11:59

标签: symfony doctrine-orm

我花了3个小时尝试在社交网络上分享PostPersist callback上的一些链接。但是,链接在社交网络页面上给了我404 error。我刚刚弄清楚当PostPersist回调被解雇时我刷新的数据并不存在。但是,在entity->flush()之后的控制器中,我使用相同的代码,然后链接工作正常。

我想知道,为什么人们会使用

/**
* @ORM\PostPersist
*/

回调函数。

1 个答案:

答案 0 :(得分:3)

来自Doctrine2 documentation

  

postPersist - 在实体持久化后,实体发生postPersist事件。它将在数据库插入操作后调用。 postPersist事件中提供了生成的主键值。

但我们必须考虑到默认情况下Doctrine2隐式调用事务。在此方法中,当您在实体管理器上使用flush()时,事务将结束。这就是为什么除非刷新实体管理器,否则无法在数据库中看到数据的原因。 EntityManager #flush()是事务开始和结束的地方。尽管如此,我们还可以显式调用事务,但它也不会让你在启动事务,持久化对象和提交事务之间看到数据库中的数据。

事实上,你不能省略Doctrine2中的交易,所以你不能指望在PostPersist事件发生后持续行动之后你的数据是可见的。

要实现这一点,您必须使用PostFlush事件。

在我的真实生活经历中的Postperist用于例如:

  1. 创建依赖于创建对象的数据(即自动翻译,自动日期,某些特定关系更新)
  2. 向其他活动发送通知
  3. 发送电子邮件
  4. 我希望这会有所帮助。

    修改
    查看onFlush事件的示例,您可以在其中查看如何遍历工作单元以访问对象的示例。 onFlush examples

    仅使用特定对象:

    if ($entity instanceof Product) {
            // do something with the YourEntityName
    }