【问题标题】:Symfony2/Doctrine - postFlushSymfony2/Doctrine - postFlush
【发布时间】:2015-02-18 17:13:22
【问题描述】:

如果您看到我之前的问题,这有点与它相关,但这是一个新问题。所以我有一个实体,我有一个与之相关的听众。在我的 createAction 中,我创建了我的对象,然后将其持久刷新到我的数据库中。在我的监听器中,我设置了一个 postFlush 函数

public function postFlush(PostFlushEventArgs $args)
{
    $em = $args->getEntityManager();

    foreach ($em->getUnitOfWork()->getScheduledEntityDeletions() as $entity) {
        if ($entity instanceof AvailabilityAlert) {
            var_dump("TEST");
            $this->api_service->addFlightsAction($entity);
        }
    }
}

我试图在这个函数中做的是获取刚刚刷新的实体。我已经尝试了 getUnitsOfWork 的所有不同操作,例如getScheduledEntityDeletions 但对于它们中的任何一个,我都无法进入 var_dump 发生的位置。

我将如何在这个 postFlush 函数中获取刷新的实体?

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    根据此处的 Doctrine2 文档:http://doctrine-orm.readthedocs.org/en/latest/reference/events.html 您不能在 PostFlush 事件上调用刷新的实体。

    但是您可以拆分您的逻辑:使用OnFlush 事件来获取这些实体,然后在刷新成功时将其传递给PostFlush

    【讨论】:

    • onFlush监听器中收集的数据如何传递给postFlush监听器?
    • 遗憾的是,我认为这是准确的。您必须在 OnFlush 上迭代 UoW,分配您需要的内容,(希望其他 lifeCycleEvents 不会更改它?)稍后在 PostFlush 上获取它。谁知道在数据库写入后触发一点代码对于 ORM 来说是如此困难。
    • 已实施的解决方案并没有那么难。似乎工作正常。
    • @ficuscr:感谢分享。
    【解决方案2】:

    要持久化到数据库实体,您不需要postFlush,而是postPersist

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

    别忘了给你的服务添加下一个标签:

    { name: "doctrine.event_listener",  event: "postPersist" }
    

    【讨论】:

    • 问题是我需要对实体做一些事情,而且我只能在它被刷新并且在数据库中之后才能做到这一点。有没有办法在 postFlush 中获取实体?
    • postPersist 你已经在数据库中有这个实体。您还可以从这条新记录中获得id
    • 在 postPersist 和 postUpdate 中,实体尚未写入数据库。名称与 Doctrine 中的大多数其他内容一样都是错误的。
    • 卢锡安的评论有误。文档清楚地说明了这一点。不过,在这个阶段仍然可以回滚。 doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 2013-10-18
    • 1970-01-01
    • 2015-06-16
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多