为什么Doctrine PostPersist Event错过了夹具类的第一个Instance元素?

问题描述 投票:0回答:1

我正在使用symfony4框架开发一个Web应用程序。在这个应用程序中我处理事件。这些事件通过另一个名为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;
    }
}

它似乎与我创建的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]);

        }
    }
}

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

由于这是我关于堆栈溢出的第一篇文章,如果我的问题不清楚,请不要犹豫,纠正我

php symfony doctrine
1个回答
1
投票

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

在创建新事件之前,需要在DB中刷新所有Users

谢谢你的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.