Niv. 2 — Intermédiaire : catalogue avec relations & auth
Objectif : introduire les relations Doctrine, la sécurité et EasyAdmin. On enrichit l’annuaire : chaque prestataire propose des services, et l’admin est protégé.
📋 Cahier des charges
Contexte — Le studio veut, en plus des prestataires, gérer leurs services (nom, durée, prix), et protéger le back-office par un login.
Périmètre inclus
- Entité
Service(name,durationMin,priceCents) reliée àProvider(OneToMany / ManyToOne). - Entité
User+ login form ; le back-office/adminréservé àROLE_ADMIN. - Un voter : un prestataire ne peut éditer que ses services (préparation à la logique fine).
- Un back-office EasyAdmin (prestataires + services) avec le prix en euros.
- Éviter le N+1 sur la liste (services par prestataire).
Périmètre exclu — API/JWT (Niv. 3), temps réel (Niv. 4).
Livrables — un back-office EasyAdmin sécurisé, avec relations.
Critères de réussite
- Un
Serviceappartient à unProvider(FK, helpers de collection). -
/adminredirige vers login si non connecté ; accessible en admin. - Le prix s’affiche/s’édite en euros (stocké en centimes).
- La liste des prestataires n’a pas de N+1 (vérifié au profiler).
🗺️ Endroits à visiter
| Besoin | Chapitre |
|---|---|
| Relations | 6.2 |
| N+1 & fetch join | 6.6 |
| User & login | 10.3 |
| Firewalls & access_control | 10.1 |
| Rôles & voters | 10.2 |
| EasyAdmin | 7.5 |
🧭 Étapes suggérées
make:entity Service+ la relation versProvider(make:entityajoute la relation interactivement).make:user+make:security:form-login;access_control: ^/admin ROLE_ADMIN.make:admin:dashboard+make:admin:crudpourProvideretService;MoneyField::setStoredAsCents().make:voter ServiceVoter(EDIT réservé au propriétaire ou admin).- Optimiser la liste : requête avec
join+addSelect(ou un compteur agrégé). - Créer un admin en base (une commande
app:create-admin, 4.6).
🎁 Bonus : ajoutez une recherche Meilisearch sur les services (6.7).
Projet suivant : Niv. 3 — Avancé (API + Next.js).