我发生了一个奇怪的错误。我有一个Alert实体,其中我存储了其他实体的集合。我还有一个名为availability的独立实体。我没有将它存储在我的Alert实体中,因为我正在其他地方处理它。我确实有一个链接到我的警报实体
/**
* @var \Nick\AlertBundle\Entity\Alert
*
* @ORM\ManyToOne(targetEntity="Nick\AlertBundle\Entity\Alert")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="alert_id", referencedColumnName="id")
* })
*/
private $alert;
/**
* Set Alert
*
* @param \Nick\AlertBundle\Entity\Alert $alert
* @return Availability
*/
public function setAvailabilityAlert(\Nick\AlertBundle\Entity\Alert $alert = null)
{
$this->alert = $alert;
return $this;
}
添加警报后,我的EventListener会对该警报执行一些其他操作。它实现的一个功能是
public function findSeatsOnFlights( $alert, $allInfo, $flights, $seatCodes )
{
$answer = array( );
foreach ( $flights as $flight )
{
$finfo = $allInfo[ $flight ];
$fseats = $finfo["seats"];
foreach ( $seatCodes as $code )
{
if ( array_key_exists( $code, $fseats ) )
{
$answer[] = $code . $fseats[$code];
var_dump("TEST");
//$this->updateAvailabilityTable($alert, $code, "L2J", $finfo["flightNumber"], $fseats[$code]);
}
}
}
return $answer;
}
我在该函数中有array_key_exists,它会检查我选择的类与我的数据中的类数组匹配的数量。因此,如果我搜索C和D类,则var_dump会打印两次TEST。所以我知道我的所有数据都没问题,它确实执行了适当的代码次数。现在将var_dump下的行注释掉,代码执行得非常快。如果我取消注释,则调用此函数
function updateAvailabilityTable($alert, $requestedSeat, $pseudo, $flightNumber, $seatCount){
$availability = new Availability();
$availability->setClassLetter($requestedSeat);
$availability->setAlertPseudo($pseudo);
$availability->setFlightNumber($flightNumber);
$availability->setAvailability($seatCount);
$availability->setLastUpdated();
$availability->setAlert($alert);
$em = $this->sc->get('doctrine.orm.entity_manager');
$em->persist($availability);
$em->flush();
}
所以这个函数应该为所选择的每个类执行。因此,如果我选择C和D,它应该执行两次,向我的数据库添加2个可用行。
问题是,当我测试出来的时候,当我看到萤火虫时,帖子请求就会永远存在。当我签出我的数据库表时,插入了正确的数据(至少一个类),但方式太多了。如果我离开它一分钟,我最终会超过100行。
为什么要执行这么多次?
更新 它可能与我的听众有关
<?php
namespace Nick\AlertBundle\EventListener;
use Doctrine\ORM\Event\PostFlushEventArgs;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Nick\AlertBundle\Entity\Alert;
use Nick\AlertBundle\Service\UapiService;
class AvailabilityAlertListener
{
protected $api_service;
protected $alertEntity;
protected $em = null;
public function __construct(UapiService $api_service)
{
$this->api_service = $api_service;
}
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof AvailabilityAlert) {
$this->alertEntity = $entity;
}
}
public function postFlush(PostFlushEventArgs $args)
{
$this->em = $args->getEntityManager();
$eventManager = $this->em->getEventManager();
$eventManager -> removeEventListener('postFlush', $this);
if (!empty($this->alertEntity)) {
$this->api_service->addFlightsAction($this->alertEntity);
$this->alertEntity=null;
}
}
}
答案 0 :(得分:0)
问题是你的postFlush
处理程序正在触发代码,该代码会触发另一个刷新事件,再次调用postFlush
。您不会检查或删除已处理的$this->alertEntity
,因此您再次触发addFlightsAction
。