2016-12-04 72 views
-1

我花了3小时试图在社交网络上的PostPersist callback一些链接分享。但是,这些链接在社交网络页面上给了我404 error。我只是想出了当PostPersist回调触发时我并不存在的数据。但是,在entity->flush()之后的控制器中,我使用了相同的代码,然后链接正常工作。为什么Symfony的使用PostPersist学说

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

/** 
* @ORM\PostPersist 
*/ 

回调。

+3

什么东西有你的社交网络网站的故事做的,为什么你会使用PostPersist的问题?创建实体后,使用PostPersist将邮件发送给用户,因此它基于事件。所以你不需要在每次刷新后在每个为你创建实体的控制器中执行它。 – Kwido

+0

我同意,在情况下,它是考虑使用[自定义事件订户]上的每个持续给定实体的发生的事件(http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html)。它们比任何回调事件更灵活。 – ferdynator

+0

@Kwido社交网络的例子是解释在PostPersist回调期间数据还没有插入到数据库中。但是在调用flush()后数据已经插入数据库。 – user3502626

回答

2

Doctrine2 documentation

postPersist - 实体已经被持久化后的postPersist事件发生时一个实体。它将在数据库插入操作之后被调用。生成的主键值在postPersist事件中可用。

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

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

为了实现这一目标,你必须使用PostFlush事件。

Postperist在我的现实生活经验用于例如:

  1. 创建依赖于创建的对象(即自动转换,自动日期,一些特定的关系更新)
  2. 将通知发送到数据其他事件
  3. 发送电子邮件

我希望这有助于。

编辑
看看onFlush事件在这里你可以看到如何通过遍历工作单元的例子让你的对象的示例。 onFlush examples

要只对特定对象的工作只是用:

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

问题是,Doctrine2说:postFlush - postFlush事件发生在刷新操作结束时。 **此事件不是生命周期回调。** – user3502626

+0

而您的Postpersist示例还可以。除非在数据被插入到数据库之前,我不同意发送电子邮件。 – user3502626

+0

@ user3502626看看我的编辑。 –