为什么“ Doctrine PostPersist事件”会错过我的灯具类的第一个实例元素?

时间:2019-02-28 13:22:22

标签: php symfony doctrine

我正在使用symfony4框架开发一个Web应用程序。在这个程序中,我处理事件。这些事件通过另一个称为参与的类与用户链接。为了确保新来者不能注册过去的活动,我在活动的第一次持续时间创建参与者,为所有已经注册的用户添加参与者。为此,我宣布了服务

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;
    }
}

它与我创建的add / new事件过程一起正常工作。但是,当我使用以下代码创建夹具来测试我的应用程序时:

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 :(得分:1)

正如Zak所解释的那样,问题来自我的Users在添加新参与者之前的坚持。

在创建新事件之前,需要将所有Users刷新到数据库中。

感谢您的帮助!