*/ public function getDependencies(): array { // SitesFixtures doit tourner AVANT AppFixtures pour que les sites // soient disponibles au rattachement des users ci-dessous. return [SitesFixtures::class]; } public function load(ObjectManager $manager): void { $adminRole = $this->ensureSystemRole( $manager, SystemRoles::ADMIN_CODE, 'Administrateur', 'Role administrateur - bypass complet via is_admin', ); $userRole = $this->ensureSystemRole( $manager, SystemRoles::USER_CODE, 'Utilisateur', 'Role de base sans permission specifique', ); // Recupere les 3 sites seedes par SitesFixtures. Si absents, c'est // une misconfiguration (fixture hors purge ou dependance ignoree) : // on fail fort avec un message explicite plutot que de continuer // avec des users orphelins de site. $chatellerault = $this->requireSite('Chatellerault'); $saintJean = $this->requireSite('Saint-Jean'); $pommevic = $this->requireSite('Pommevic'); $admin = new User(); $admin->setUsername('admin'); $admin->setIsAdmin(true); $admin->setPassword($this->passwordHasher->hashPassword($admin, 'admin')); $admin->addRbacRole($adminRole); // Admin rattache aux 3 sites pour faciliter le dev / les tests manuels. $admin->addSite($chatellerault); $admin->addSite($saintJean); $admin->addSite($pommevic); $admin->setCurrentSite($chatellerault); $manager->persist($admin); $alice = new User(); $alice->setUsername('alice'); $alice->setPassword($this->passwordHasher->hashPassword($alice, 'alice')); $alice->addRbacRole($userRole); // Alice : un seul site, site courant = ce site. $alice->addSite($chatellerault); $alice->setCurrentSite($chatellerault); $manager->persist($alice); $bob = new User(); $bob->setUsername('bob'); $bob->setPassword($this->passwordHasher->hashPassword($bob, 'bob')); $bob->addRbacRole($userRole); // Bob : site different de Alice, pour prouver le filtrage par site // dans les futurs tests (ticket 4 outillage SiteAware). $bob->addSite($saintJean); $bob->setCurrentSite($saintJean); $manager->persist($bob); $manager->flush(); } /** * Retourne le role systeme correspondant au code donne, en le creant * s'il n'existe pas encore (le purger Doctrine a pu vider la table role). * * La description est recopiee depuis la migration RBAC pour que les * deux chemins (migration prod, fixtures dev) produisent un etat * identique. */ private function ensureSystemRole( ObjectManager $manager, string $code, string $label, string $description, ): Role { $role = $this->roleRepository->findByCode($code); if (null !== $role) { return $role; } $role = new Role($code, $label, isSystem: true, description: $description); $manager->persist($role); return $role; } private function requireSite(string $name): SiteInterface { $site = $this->siteProvider->findByName($name); if (null === $site) { throw new RuntimeException(sprintf( 'SitesFixtures doit avoir seede le site "%s" avant le chargement des users. ' .'Verifier que SitesFixtures est bien en dependance de AppFixtures.', $name, )); } return $site; } }