Symfony/FOSUserBundle: загрузить существующего пользователя из базы данных в Fixtures

Моя проблема связана с тем, что у меня есть отношение в моих сущностях, которые зависят друг от друга. Моя сущность Link имеет отношение с сущностью User. Когда я пытаюсь загрузить пользователя с помощью UserManagerInterface, он возвращает НУЛЕВОЙ. Вот мой класс AppFixtures:

<?php

namespace App\DataFixtures;

use App\Component\Localization;
use App\Entity\Link;
use App\Entity\LinkClick;
use App\Entity\LinkView;
use App\Entity\Visitor;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Faker;
use FOS\UserBundle\Model\UserManagerInterface;
use PUGX\Shortid\Shortid;

class AppFixtures extends Fixture
{
    private $userManager;

    private $localisation;

    public function __construct(UserManagerInterface $userManager, Localization $localization)
    {
        $this->userManager = $userManager;

        $faker = Faker\Factory::create();
        $localization->setParameters($localization::GEO_PLUGIN, $faker->ipv4);
        $localization->localize();
        $this->localisation = $localization->getResult();
    }

    public function load(ObjectManager $manager): void
    {
        $faker = Faker\Factory::create();
        $user  = $this->userManager->createUser();
        $user->setUsername('admin');
        $user->setEmail('[email protected]');
        $user->setPlainPassword('admin');
        $user->setEnabled(true);
        $user->setRoles(['ROLE_ADMIN']);
        $this->userManager->updateUser($user);
        $links    = [];
        $visitors = [];
        for ($i = 0; $i < 100; ++$i) {
            $link = new Link();
            $link->setUrl($faker->url);
            $link->setSlug(Shortid::generate(12, 'abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01', true));
            $link->setCreatedAt($faker->dateTime);
            $link->setUser($user);
            $links[] = $link;
            $manager->persist($link);
        }

        for ($i = 0; $i < 10000; ++$i) {
            $visitor = new Visitor();
            $visitor->setIp($this->localisation->geoplugin_request);
            $visitor->setCountryCode($this->localisation->geoplugin_countryCode);
            $visitor->setCountryName($this->localisation->geoplugin_countryName);
            $visitors[] = $visitor;
            $manager->persist($visitor);
        }

        for ($i = 0; $i < 10000; ++$i) {
            $linkView = new LinkView();
            $linkView->setDate($faker->dateTimeBetween('-1 years', 'now'));
            $linkView->setVisitor($visitors[rand(0, 999)]);
            $linkView->setLink($links[rand(0, 99)]);
            $manager->persist($linkView);
        }

        for ($i = 0; $i < 10000; ++$i) {
            $linkClick = new LinkClick();
            $linkClick->setDate($faker->dateTimeBetween('-1 years', 'now'));
            $linkClick->setVisitor($visitors[rand(0, 999)]);
            $linkClick->setLink($links[rand(0, 99)]);
            $manager->persist($linkClick);
        }

        $manager->flush();
    }
}

Я не хочу каждый раз очищать базу данных, я хочу использовать существующего пользователя, поэтому я могу добавлять приборы. Сейчас выдает ошибку:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin' for key 'UNIQ_1483A5E992FC23A8'

Я думаю, что эта ошибка возникает из-за того, что уже существует имя пользователя со значением «admin». Согласно этой документации совместное использование объектов между приборами, вы можете совместно использовать объекты между приборами. Таким образом, вы можете определить фиксацию пользователя и фикстуру ссылки, вы определяете приоритет между ними, чтобы заставить фикстуру пользователя загружаться перед фикстурой ссылки ( загрузка файлов приспособлений по порядку )

William Bridge 17.03.2019 09:50

Проблема в том, что я не хочу воссоздавать пользователя каждый раз, но если я сделаю то, что вы предложили, ничего не изменится, я все равно не смогу добавить загрузку.

Salim Ben Aissa 17.03.2019 17:37

1- Вам действительно нужно использовать эту строку: $this->userManager->updateUser($user);? 2- Согласно этому ответу загрузка-контейнера-и-сущности-менеджера-в-фиксации-в-symfony‌​2, вы можете попробовать это с Symfony 4, сначала проверив, существует ли пользователь со значением «admin» для имени пользователя в базе данных. если нет, вы создаете этого пользователя (без сброса). Все это для того, чтобы избежать ошибки нарушения ограничения целостности.

William Bridge 18.03.2019 03:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
3
164
0

Другие вопросы по теме