得到了另一个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 }
由于
答案 0 :(得分:0)
由于插入是在尚未提交的事务中发生的,因此您刚刚编写的记录可能尚未可用于回读。
如果您需要对addFlightsAction
进行调用所需的所有数据都在实体中,那么您可以获得数据。或者,您可以通过$args->getEntityManager()->getUnitOfWork();
否则,在事务提交完成后,您可以随时在刷新后运行addFlight代码。
答案 1 :(得分:0)
在postFlush事件而不是postPersist事件中触发您的查询,这应该让您如上所述执行$ id-1。
请注意,postFlush args是PostFlushEventArgs
的实例,而不是LifecycleEventArgs