【问题标题】:Symfony2 - postPersist does not happen after persistSymfony2 - postPersist 在坚持后不会发生
【发布时间】:2015-02-17 18:19:34
【问题描述】:

遇到了另一个 Symfony2 问题,更具体地说,postPersist 在持久化后似乎没有执行。

在我的控制器中,我有一个 createAction(删除了一些代码)

public function createAction(Request $request)
{
    try {

        $em = $this->getDoctrine()->getManager();

        $alert = new AvailabilityAlert();
        $alert->setLastUpdated();
        $alert->setIsDeleted(0);
        $alert->setAlertStatus('Active');

        $em->persist($alert);
        $em->flush();

        return new JsonResponse('Success');

    }catch (Exception $e) {
    }

}

为此,我有一个 EventListener

<?php

namespace Nick\AlertBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Nick\AlertBundle\Entity\AvailabilityAlert;
use Nick\AlertBundle\Service\UapiService;

class AvailabilityAlertListener
{
    protected $api_service;

    public function __construct(UapiService $api_service)
    {
        $this->api_service = $api_service;
    }

    public function postPersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        if ($entity instanceof AvailabilityAlert) {
            $this->api_service->addFlightsAction($entity);
        }
    }
}

据我了解,这个 postPersist 应该在 AvailabilityAlert 持久化到数据库之后执行?

在我的监听器中,我调用了一个函数 addFlightsAction。此函数执行数据库查询。这个查询本质上选择了我需要的数据,其中 id 等于我传递给它的 id(由 new AvailabilityAlert() 创建的那个)。为了得到这个 id,我使用 $entity->getId()。

我已经输出了id,它是正确的。但是,当我从数据库查询输出结果时,我收到一个空数组。但是,如果在我的数据库查询中我这样做了

$id = $entity->getId();
... query code
->setParameter('id', $id-1)

所以从当前id中取1,查询返回我插入的最后一个alert的数据。所以这告诉我,当我给它当前警报的警报 ID 并且我没有从中获得任何数据时,当前警报在发生这种情况时还没有持久化到数据库中。

有没有办法解决这个问题?

附言我的服务

doctrine.availability_alert_listener:
        class: Nick\AlertBundle\EventListener\AvailabilityAlertListener
        arguments: [@alert_bundle.api_service]
        tags:
            - { name: doctrine.event_listener, event: postPersist }

谢谢

【问题讨论】:

  • 您是否在服务中将您的类定义为教义.event.listener?
  • 我将其定义为标签,例如- {名称:教义.event_listener,事件:postPersist }

标签: symfony doctrine-orm


【解决方案1】:

由于插入发生在尚未提交的事务中,您刚刚写入的记录可能还不能读回。

如果您调用addFlightsAction 所需的所有数据都在实体中,那么您就可以在那里获得数据。或者,您可以通过$args-&gt;getEntityManager()-&gt;getUnitOfWork(); 收集刚刚写入的其余数据

否则,您总是可以在提交事务后在刷新后运行 addFlight 代码。

【讨论】:

  • 我绝对需要它在刷新之后发生,因为它依赖于获取数据库中的数据。我试过这样做,但我不明白 getUnitsOfWork 给了我什么。有没有办法像我在上面的代码中那样使用它来获取实体?
【解决方案2】:

在 postFlush 事件而不是 postPersist 事件中触发您的查询,这应该可以让您按照上述方式执行 $id-1。

请记住,postFlush args 是 PostFlushEventArgs 的实例,而不是 LifecycleEventArgs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多