Почему событие Doctrine PostPersist пропускает первый элемент Instance моего класса приборов? - PullRequest
0 голосов
/ 28 февраля 2019

Я занимаюсь разработкой веб-приложения с использованием фреймворка symfony4.В этом приложении я имею дело с событиями.Эти события связаны с пользователями через другой класс, называемый Участие.Чтобы убедиться, что новичок не может зарегистрироваться для участия в прошлом событии, я создаю участие при первом сохранении события, добавляя участие для всех уже зарегистрированных пользователей.Для этого я объявил службу

service: 
    App\EventListener\CreateParticipations:
    tags:
        - { name: doctrine.event_listener, event: postPersist }
    arguments: [ "@doctrine.orm.entity_manager" ]

Определенную таким образом:

<?php

namespace App\EventListener;

use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use App\Entity\Participation;
use App\Entity\Event;
use App\Entity\User;
use Doctrine\ORM\EntityManager;

class CreateParticipations
{
    private $em; // EntityManager

    public function __construct(EntityManager $entityManager)
    {
        $this->em = $entityManager;
    }
    public function postPersist(LifecycleEventArgs $args)
    {

        $event = $args->getObject();

        if ($event instanceof Event) { 

            $users = $this->em->getRepository(User::class)->findAll();
            $nbUser = count($users);
            for ($i=0; $i < $nbUser; $i++)
            {
                $participation = new Participation ();
                $participation->setUser($users[$i]);
                $participation->setEvent($event);

                $this->em->persist($participation);
            }

            $this->em->flush();
        }

        return;
    }
}

Кажется, что она отлично работает с созданной мной процедурой добавления / нового события.Но когда я создаю какой-то прибор для тестирования моего приложения с этим кодом:

class AppFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {
        //creation of the users and tags
        //event creator
        $nbEvent = 1;
        $events = array($nbEvent);
        for ($i=0; $i< $nbEvent; $i++)
        {
            $events[$i] = new Event();

            $date = $faker->dateTimeThisMonth($max = 'now', $timezone = null);
            $fin = new \DateTime($date->format('Y-m-d H:i:s'));
            $events[$i]->setStart($date);
            $events[$i]->setFinish($fin->add(new \DateInterval('PT2H')));
            $events[$i]->setInfo($faker->sentence(10, true));
            $events[$i]->setMaxPlayers(10);
            $events[$i]->setName($faker->word());
            $events[$i]->setTag($tag[$faker->numberBetween(0, 2)]);
            $events[$i]->setActive(true);

            $location = new Location();
            $location->setFullAdr($faker->address());
            $location->setLat($faker->latitude($min = -90, $max = 90));
            $location->setLng($faker->longitude($min = -180, $max = 180));

            $events[$i]->setLocation($location);

            $manager->persist($events[$i]);

        }
    }
}

, первое событие, сброшенное в моей базе данных, не имеет участия, связанного с.Вы видите, откуда происходит это странное поведение?

Поскольку это мой первый пост о переполнении стека, не стесняйтесь исправить меня, если мой вопрос неясен

1 Ответ

0 голосов
/ 11 марта 2019

как объяснил Зак , проблема заключается в постоянстве моего Users перед добавлением новых участников.

Все Users необходимо сбросить в БД перед созданием новых событий.

Спасибо за вашу помощь!

...