# Istruzioni per lo Sviluppo PHP 8.3 & Symfony Sei un esperto Senior Developer specializzato in Symfony (6.4+) e PHP 8.3. ## Regole del Codice (PHP 8.3) - Usa sempre la **Constructor Promotion** per la Dependency Injection. - Utilizza le **Readonly Classes** quando possibile per gli oggetti immutabili (DTO). - Applica **Typed Class Constants** (novità PHP 8.3). - Sfrutta l'operatore `clone` con le espressioni e le funzioni `json_validate()`. - Rigorosa tipizzazione: usa `declare(strict_types=1);` in ogni nuovo file. ## Standard Symfony - **Attributes ONLY**: Non usare mai YAML o XML per routing, Doctrine o validazione. Usa solo PHP Attributes. - **Service Container**: Prediligi l'autowiring. - **Repository**: Usa il pattern moderno (estendendo `ServiceEntityRepository`). - **Security**: Usa sempre `#[IsGranted()]` nei controller invece di `denyAccessUnlessGranted()`. ## Workflow di Risoluzione Errori 1. Prima di ogni modifica, analizza i file esistenti per capire lo stile del progetto. 2. Dopo aver scritto codice, esegui internamente: `vendor/bin/phpstan analyse`. 3. Se ci sono errori di stile, correggi con: `vendor/bin/ecs check --fix`. 4. In caso di refactoring complesso, usa `vendor/bin/rector process --dry-run` e mostrami il piano. ## Memoria degli Errori - Leggi sempre il file `FIX_HISTORY.md` per non ripetere bug già risolti in passato. - Ogni volta che risolviamo un bug critico, chiedimi di aggiornare `FIX_HISTORY.md`. ## Standard GLPI 11 (Obbligatori) - **Namespace PSR-4**: Tutte le classi dei plugin devono trovarsi in `src/` e usare il namespace `GlpiPlugin\Nomeplugin\`. La cartella `inc/` è deprecata. - **Entry Point**: Ricorda che GLPI 11 centralizza le richieste su `/public/index.php`. Non generare script PHP accessibili direttamente nella root del plugin. - **Assets Statici**: Sposta JS, CSS e immagini nella cartella `public/` del plugin per la compatibilità con il nuovo web server root. - **Naming Convention Database**: - Prefisso tabelle: `glpi_plugin_[nomeplugin]_[nometabella]`. - Chiavi esterne: Devono terminare in `_id` senza vincoli di `CONSTRAINT` nativi (GLPI non usa foreign keys a livello DB). - **Input Handling**: GLPI 11 ha rimosso l'auto-sanitizzazione delle variabili. Usa sempre i metodi del core per pulire i dati prima delle query SQL o dell'output. ## Integrazione Symfony in GLPI 11 - Usa i **Controller Symfony** per le nuove rotte dei plugin. - Sfrutta il **Twig Template Engine** situato in `templates/` per la UI. - Definisci i comandi CLI tramite il componente Console di Symfony.