У меня странная ошибка. У меня есть объект Alert, и в нем хранятся коллекции других объектов. У меня также есть отдельная сущность, называемая доступностью. Я не храню это в своем объекте Alert, поскольку я обрабатываю его где-то еще. У меня есть ссылка на него, мой объект 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, он должен выполняться дважды, добавляя две строки доступности в мою базу данных.
Проблема в том, что, когда я проверяю ситуацию, когда я смотрю на firebug, пост-запрос просто продолжается вечно. Когда я проверяю таблицу базы данных, правильные данные были вставлены (по одному классу по крайней мере), но слишком много раз. Если я оставлю это на минуту, я получаю более 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;
}
}
}
Проблема в том, что ваш обработчик postFlush
запускает код, который запускает другое событие flush, которое вызывает postFlush
снова. Вы не проверяете или не удаляете обработанную $this->alertEntity
, поэтому вы снова addFlightsAction
.