16.5 — Pièges & FAQ
Les erreurs les plus fréquentes (surtout pour un dev venant de JS), regroupées.
Pièges de langage (dev JS → PHP)
| Piège | Correction |
|---|---|
'a' + 'b' pour concaténer | 'a' . 'b' (le .) |
== | === (toujours strict) |
$obj.prop | $obj->prop |
Class.method() | Class::method() |
${var} dans une chaîne | "{$obj->prop}" ou "$var" |
oublier $ devant les variables | toujours $var |
closure sans use | function () use ($x) {} (ou fn qui capture auto) |
oublier declare(strict_types=1) | en tête de chaque fichier |
| chercher du typage structurel | PHP est nominal → implémenter l’interface |
chercher async/await | pas d’async : Messenger + workers |
Pièges Symfony / framework
| Piège | Solution |
|---|---|
_meta.js liste un fichier inexistant (Nextra) | ne lister que les pages existantes |
| cache dev « périmé » après un changement de config | php bin/console cache:clear |
secret dans .env (committé) | .env.local ou coffre de secrets |
déployer en APP_ENV=dev | toujours prod + APP_DEBUG=0 en prod |
EntityManager + logique dans le contrôleur | contrôleur fin → déléguer à un service |
| lier un formulaire à l’entité (mass assignment) | passer par un DTO |
flush() dans une boucle | un seul flush() (ou par lots) |
| ne modifier qu’un côté d’une relation | passer par les helpers addX/removeX |
| collection non initialisée | new ArrayCollection() au constructeur |
| N+1 sur une liste | fetch join (join + addSelect) |
CollectionType ne persiste pas | by_reference: false |
#[ApiResource] sans groupes (over-exposure) | définir normalization/denormalizationContext |
| voter par item pour sécuriser une collection | extension Doctrine (filtre SQL) |
| état dans une propriété de service (worker mode) | services sans état / ResetInterface |
| envoyer un e-mail dans un événement Doctrine | événement de domaine après flush, ou Messenger |
| confirmer un paiement sur la redirection Stripe | via le webhook signé |
allow_origin: '*' + credentials (CORS) | origine exacte |
stocker le JWT en localStorage (Next.js) | cookie httpOnly posé côté serveur |
FAQ
Symfony ou Laravel ? — Symfony pour la stabilité, l’explicite, les gros projets/API durables ; Laravel pour le prototypage rapide façon conventions. (1.4)
Faut-il connaître PHP avant Symfony ? — Oui, le PHP moderne (8+). C’est l’objet de la Partie 2 (obligatoire si vous êtes rouillé).
7.4 LTS ou 8.x ? — 7.4 LTS comme référence (support long) ; écrit sans dépréciations = code 8.x-ready. (1.2, ADR 0001)
AssetMapper ou Webpack Encore ? — AssetMapper par défaut (sans build) ; Encore pour les builds front complexes/legacy. (7.3)
Twig ou API + Next.js ? — Les deux : Twig/Symfony UX pour le back-office, API pour le front public Next.js. (8.4)
Comment faire du temps réel ? — Mercure (SSE), pas de WebSocket à gérer ; #[ApiResource(mercure: true)] ou #[Broadcast]. (12.5)
Comment migrer depuis Symfony 5 ? — LTS en LTS (5.4 → 6.4 → 7.4), avec Rector pour automatiser. (16.6)
Où héberger ? — Platform.sh/Upsun (PaaS Symfony) ou VPS + Docker/FrankenPHP. (15.4)
Comment tester une API protégée ? — ApiTestCase + JWT via /api/login_check, assertions JSON/schéma. (14.3)
Suivant : 16.6 — Migration Symfony 5 → 7.