feat(sites) : brique fondatrice du module Sites (ticket 1/4)
Module Sites optionnel et desactivable via config/modules.php. Entite Site (nom unique, ville, CP FR, couleur hex, adresse), repository + impl Doctrine, migration racine (namespace DoctrineMigrations conforme exception CLAUDE.md), fixtures idempotentes (Chatellerault, Saint-Jean, Pommevic), permissions RBAC sites.view/sites.manage. Tests unitaires + validation via KernelTestCase (UniqueEntity, regex hex et CP, NotBlank, Length). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
105
src/Module/Sites/Infrastructure/DataFixtures/SitesFixtures.php
Normal file
105
src/Module/Sites/Infrastructure/DataFixtures/SitesFixtures.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Module\Sites\Infrastructure\DataFixtures;
|
||||
|
||||
use App\Module\Sites\Domain\Entity\Site;
|
||||
use App\Module\Sites\Domain\Repository\SiteRepositoryInterface;
|
||||
use Doctrine\Bundle\FixturesBundle\Fixture;
|
||||
use Doctrine\Persistence\ObjectManager;
|
||||
|
||||
/**
|
||||
* Fixtures du module Sites : 3 etablissements de demonstration utilises par
|
||||
* les tickets suivants (rattachement utilisateurs, navbar, etc.).
|
||||
*
|
||||
* Idempotence supportee : le purger Doctrine (ORMPurger) vide la table
|
||||
* `site` avant chaque `doctrine:fixtures:load`. Si le purger est
|
||||
* desactive et la fixture rejouee telle quelle sur une base deja seedee,
|
||||
* le lookup par nom evite le doublon et re-aligne les autres champs.
|
||||
*
|
||||
* Idempotence NON supportee :
|
||||
* - chargement cumulatif apres qu'une autre fixture ait persiste (sans
|
||||
* flush) des Site dans la meme session : `findByName()` s'appuie sur
|
||||
* `findOneBy`, qui n'inspecte pas les entites en attente dans l'unit-of-work
|
||||
* et peut renvoyer null alors qu'un homonyme est deja manage ;
|
||||
* - renommage d'un site : le nom etant la cle de lookup, modifier
|
||||
* `name` dans cette fixture cree un nouveau site et laisse l'ancien
|
||||
* en base (purger desactive). Les autres champs (city, color, etc.)
|
||||
* sont en revanche bien re-synchronises pour un site retrouve.
|
||||
*/
|
||||
class SitesFixtures extends Fixture
|
||||
{
|
||||
public function __construct(
|
||||
private readonly SiteRepositoryInterface $siteRepository,
|
||||
) {}
|
||||
|
||||
public function load(ObjectManager $manager): void
|
||||
{
|
||||
// Chatellerault : couleur imposee par le ticket (bleu Coltura).
|
||||
$this->ensureSite(
|
||||
$manager,
|
||||
name: 'Chatellerault',
|
||||
city: 'Chatellerault',
|
||||
postalCode: '86100',
|
||||
color: '#056CF2',
|
||||
fullAddress: "1 avenue de l'Europe\n86100 Chatellerault",
|
||||
);
|
||||
|
||||
// Saint-Jean : vert emeraude pour contraster avec le bleu Chatellerault.
|
||||
$this->ensureSite(
|
||||
$manager,
|
||||
name: 'Saint-Jean',
|
||||
city: 'Saint-Jean-de-Sauves',
|
||||
postalCode: '86330',
|
||||
color: '#10B981',
|
||||
fullAddress: "12 route de Poitiers\n86330 Saint-Jean-de-Sauves",
|
||||
);
|
||||
|
||||
// Pommevic : ambre pour une troisieme teinte nettement distincte.
|
||||
$this->ensureSite(
|
||||
$manager,
|
||||
name: 'Pommevic',
|
||||
city: 'Pommevic',
|
||||
postalCode: '82400',
|
||||
color: '#F59E0B',
|
||||
fullAddress: "5 chemin des Peupliers\n82400 Pommevic",
|
||||
);
|
||||
|
||||
$manager->flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Cree le site s'il n'existe pas encore, sinon re-aligne ville, code
|
||||
* postal, couleur et adresse sur les valeurs de reference.
|
||||
*
|
||||
* Note : le nom sert de cle de lookup (il est unique en base) et n'est
|
||||
* donc pas resynchronise. Consequence : renommer un site dans la
|
||||
* fixture cree un nouveau site sans supprimer l'ancien, sauf si le
|
||||
* purger Doctrine est actif (cas nominal de `doctrine:fixtures:load`).
|
||||
*/
|
||||
private function ensureSite(
|
||||
ObjectManager $manager,
|
||||
string $name,
|
||||
string $city,
|
||||
string $postalCode,
|
||||
string $color,
|
||||
string $fullAddress,
|
||||
): Site {
|
||||
$site = $this->siteRepository->findByName($name);
|
||||
|
||||
if (null === $site) {
|
||||
$site = new Site($name, $city, $postalCode, $color, $fullAddress);
|
||||
$manager->persist($site);
|
||||
|
||||
return $site;
|
||||
}
|
||||
|
||||
$site->setCity($city);
|
||||
$site->setPostalCode($postalCode);
|
||||
$site->setColor($color);
|
||||
$site->setFullAddress($fullAddress);
|
||||
|
||||
return $site;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user