我花了3个小时尝试在社交网络上分享PostPersist callback
上的一些链接。但是,链接在社交网络页面上给了我404 error
。我刚刚弄清楚当PostPersist回调被解雇时我刷新的数据并不存在。但是,在entity->flush()
之后的控制器中,我使用相同的代码,然后链接工作正常。
我想知道,为什么人们会使用
/**
* @ORM\PostPersist
*/
回调函数。
答案 0 :(得分:3)
postPersist - 在实体持久化后,实体发生postPersist事件。它将在数据库插入操作后调用。 postPersist事件中提供了生成的主键值。
但我们必须考虑到默认情况下Doctrine2隐式调用事务。在此方法中,当您在实体管理器上使用flush()时,事务将结束。这就是为什么除非刷新实体管理器,否则无法在数据库中看到数据的原因。 EntityManager #flush()是事务开始和结束的地方。尽管如此,我们还可以显式调用事务,但它也不会让你在启动事务,持久化对象和提交事务之间看到数据库中的数据。
事实上,你不能省略Doctrine2中的交易,所以你不能指望在PostPersist事件发生后持续行动之后你的数据是可见的。
要实现这一点,您必须使用PostFlush事件。
在我的真实生活经历中的Postperist用于例如:
我希望这会有所帮助。
修改强>
查看onFlush
事件的示例,您可以在其中查看如何遍历工作单元以访问对象的示例。
onFlush examples
仅使用特定对象:
if ($entity instanceof Product) {
// do something with the YourEntityName
}