【发布时间】: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