# Backend — Regles PHP / Symfony / API Platform ## Structure de fichier - Toujours `declare(strict_types=1);` en tete de tout fichier PHP - PHP CS Fixer : regles Symfony + PSR-12 + strict types (commande : `make php-cs-fixer-allow-risky`) - Commentaires (docblock, inline, bloc) **en francais** ; code (classes, methodes, variables) en anglais ## API Platform (pas de controllers) - Toujours utiliser `#[ApiResource]` + Providers + Processors — pas de controllers Symfony classiques - Routes prefixees `/api` (via `config/routes/api_platform.yaml`) - Le login `/login_check` est **hors** prefix `/api` (nginx reecrit `REQUEST_URI` vers `/login_check`) - **Exception** : si tu dois creer un controller custom sous `/api/`, mettre `priority: 1` sur `#[Route]` pour eviter le conflit avec API Platform `{id}` ## Pagination (obligatoire) **Regle** : toute collection API DOIT etre paginee. Aucun retour de collection complete cote serveur. ### Standard global Pose dans `config/packages/api_platform.yaml` (section `defaults:`) et heritee par toutes les ressources : | Cle | Valeur | Effet | |---|---|---| | `pagination_enabled` | `true` | Pagination Hydra active par defaut. | | `pagination_items_per_page` | `10` | Taille de page par defaut, aligne sur l'UI `MalioDataTable`. | | `pagination_maximum_items_per_page` | `50` | Borne dure : `?itemsPerPage=999` → ramene a 50. Anti deep-fetch. | | `pagination_client_items_per_page` | `true` | Le client peut envoyer `?itemsPerPage=25` (bornee par le max). | | `pagination_client_enabled` | `true` | Le client peut envoyer `?pagination=false` pour TOUT recuperer (echappatoire selects). | ### Override par ressource (rare) Si une ressource a besoin d'un autre defaut (ex: payload lourd), utiliser les attributs sur l'operation. **JAMAIS `paginationEnabled: false`** sans whitelist explicite dans `tests/Architecture/CollectionsArePaginatedTest::EXCLUDED`. ```php new GetCollection( paginationItemsPerPage: 5, // override taille par defaut paginationMaximumItemsPerPage: 20, // override borne max ) ``` ### Selects et autocompletions Pour alimenter un `