Symfony2 - начальные данные добавляются в базу данных

0

У меня странная ошибка. У меня есть объект 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;
        }
    }
}
  • 0
    На каком классе сущностей слушает событие слушатель?
  • 0
    Добавляется в класс Alert
Показать ещё 15 комментариев
Теги:

1 ответ

0

Проблема в том, что ваш обработчик postFlush запускает код, который запускает другое событие flush, которое вызывает postFlush снова. Вы не проверяете или не удаляете обработанную $this->alertEntity, поэтому вы снова addFlightsAction.

  • 0
    Извините, немного недопонимаю это. Разве функция postFlush просто вызывает функцию addFlightsAction, передавая ей переменную? Когда я помещаю var_dump в этот postFlush, он выполняется только один раз.
  • 0
    @NickPrice это может быть правильно: я не заметил, что вы не проверяете класс сущности. В ваших слушателях вы всегда должны проверять классы, которые вы могли бы застревать в ситуации, которую вы не хотите ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню