Bonjour à tous,
Malgré la documentation et la vidéo de grafikart sur les fixtures symfony, je ne parviens pas à solutionner mon problème.
J'utilise symfony 7 / doctrine-fixtures-bundle 4.1
J'ai 2 fixtures. UserFixtures et ProfilFixtures.
l'objet User a besoin d'un objet Profil préalablement créé.
Ma fixture ProfilFixtures :
namespace App\DataFixtures;
use App\Entity\Profil;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
class ProfilFixtures extends Fixture
{
public const PROFIL_STANDARD = 'profil_standard';
public function load(ObjectManager $manager): void
{
$profil = new Profil();
$profil->setName('STANDARD');
$profil->setCreatedAt(new \DateTime('now'));
$profil->setCreatedBy('André DUPONT');
$manager->persist($profil);
$manager->flush();
$this->addReference(self::PROFIL_STANDARD, $profil);
}
}
Ma fixture UserFixtures :
namespace App\DataFixtures;
use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class UserFixtures extends Fixture
{
private $userPasswordHasher;
public function __construct(UserPasswordHasherInterface $userPasswordHasher)
{
$this->userPasswordHasher = $userPasswordHasher;
}
public function load(ObjectManager $manager): void
{
$user = new User();
$user->setEmail('dupont@aa.com');
$user->setRoles(['ROLE_USER']);
$user->setProfil($this->getReference(ProfilFixtures::PROFIL_STANDARD, Profil::class));
$user->setPassword($this->userPasswordHasher->hashPassword($user, 'password'));
$manager->persist($user);
$manager->flush();
}
}
Lorsque je charge mes fixtures, j'ai l'erreur :
Reference to "profil_standard" for class "App\DataFixtures\Profil" does not exist
Pourtant la fixture ProfilFixtures est bien chargée avant celle des utilistateurs dans la console:
purging database
loading App\DataFixtures\ProfilFixtures
loading App\DataFixtures\UserFixtures
Si je log ma référence directement dans ProfilFixtures :
dd($this->getReference(ProfilFixtures::PROFIL_STANDARD, Profil::class));
elle s'affiche bien dans la console :
^ App\Entity\Profil^ {#670
-id: 38
-name: "STANDARD"
-created_at: DateTime @1746522834 {#674
date: 2025-05-06 09:13:54.818294 UTC (+00:00)
}
-created_by: "André Dupont"
-updated_at: null
-updated_by: null
}
J'ai suivi la doc sur le partage d'objet ici :
https://symfony.com/bundles/DoctrineFixturesBundle/current/index.html#sharing-objects-between-fixtures
Mais cela ne fonctionne pas.
Si quelqu'un peut m'éclairer
Je vous remercie d'avance