Symfony2 - postPersist在坚持之后不会发生

时间:2015-02-17 18:19:34

标签: symfony doctrine-orm

得到了另一个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(由新的AvailabilityAlert()创建的id)。要获得此ID,我使用$ entity-&gt; getId()。

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

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

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

有什么方法可以解决这个问题吗?

P.S。我的服务

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

由于

2 个答案:

答案 0 :(得分:0)

由于插入是在尚未提交的事务中发生的,因此您刚刚编写的记录可能尚未可用于回读。

如果您需要对addFlightsAction进行调用所需的所有数据都在实体中,那么您可以获得数据。或者,您可以通过$args->getEntityManager()->getUnitOfWork();

收集刚刚写入的其余数据

否则,在事务提交完成后,您可以随时在刷新后运行addFlight代码。

答案 1 :(得分:0)

在postFlush事件而不是postPersist事件中触发您的查询,这应该让您如上所述执行$ id-1。

请注意,postFlush args是PostFlushEventArgs的实例,而不是LifecycleEventArgs