首页 > 解决方案 > 为什么 Doctrine PostPersist Event 错过了我的夹具类的第一个 Instance 元素?

问题描述

我正在使用 symfony4 框架开发一个网络应用程序。在这个应用程序中,我处理事件。这些事件通过另一个名为 Participation 的类链接到用户。为了确保新人无法注册过去的活动,我在活动的第一次持久性中创建了参与,为所有已经注册的用户添加了参与。为此,我声明了一项服务

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]);

        }
    }
}

在我的数据库中刷新的第一个事件没有关联的参与。你知道这种奇怪的行为是从哪里来的吗?

因为这是我关于堆栈溢出的第一篇文章,如果我的问题不清楚,请随时纠正我

标签: phpsymfonydoctrine

解决方案


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

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

谢谢你的帮助!


推荐阅读