Novità in Symfony 8.2: Form basati su attributi (Symfony Blog)
Symfony consiglia di creare i form in classi anziché nei controller. È la scelta giusta per la maggior parte dei form, ma le applicazioni con molti piccoli DTO finiscono per avere tantissime classi di form il cui unico contenuto è un elenco di campi.
Symfony 8.2 ti permette di definire i form type con gli attributi PHP direttamente sulla classe che contiene i dati. Questo è soprattutto utile per form semplici supportati da DTO. Non depreca nulla e le classi di form restano la strada da seguire quando un form richiede più di un semplice elenco di campi.
Per creare un form in una classe DTO, aggiungi l'attributo #[AsFormType] alla classe e l'attributo #[FormField] a ogni proprietà che deve diventare un campo:
Il nome della classe può ora essere usato ovunque sia atteso il nome di un form type:
Symfony legge questi attributi durante la compilazione del service container e trasforma ogni classe in un normale servizio form type. Qualsiasi errore (ad esempio un nome di campo duplicato) viene rilevato durante la compilazione del container, non alla prima richiesta.
Perché questo funzioni, la classe DTO deve essere scansionata dal container con l'autoconfigurazione abilitata. Il file config/services.yaml predefinito lo fa già per src/, ma tieni presente che esclude src/Entity/.
I valori delle opzioni devono essere scalari, array o enum (le closure vengono rifiutate, anche se PHP 8.5 le accetta negli attributi). Per passare un servizio, usa un oggetto Reference, che il container inietta come al solito:
Le stringhe letterali restano tali: un segno % in un valore di opzione come 'label' => '100% free' non viene scambiato per un parametro del container.
Gli attributi descrivono solo i campi. Form events, data transformer, campi calcolati a runtime e qualsiasi altra cosa che necessiti di servizi vanno inseriti in una form type extension che ha come target la classe dei dati. Questo funziona perché il form type derivato mantiene la classe dei dati come propria identità:
Quando una classe con #[AsFormType] estende altre classi, l'antenato più vicino che possiede anch'esso l'attributo diventa il form type genitore e i suoi campi vengono ereditati; altrimenti il genitore è FormType.
Altri articoli recenti
Laravel AI 1.1 e 1.2: Agent Skills, Cohere e structured output più solidi
Le release 1.1.0 e 1.2.0 di laravel/ai portano gli Agent Skills, l'approvazione obbligatoria per i tool built-in e nuovi provider come Cohere e Laya self-hosted. Sul fronte qualità arrivano i fix allo structured output per Bedrock e il supporto alle provider options. Aggiornati anche i modelli di default, con Claude 4.7+ che ignora i sampling params.
Laravel 13.35.0: scheduler più controllabile, code più flessibili e response Markdown
Laravel 13.35.0 porta Schedule::alwaysOnOneServer(), il supporto a schedule:interrupt per i comandi di lunga durata, --memory in percentuale per queue:work e il nuovo metodo markdown() sulla response factory. Tante piccole migliorie anche a test, view compilate in parallelo e dischi local.
BashBox: un interprete Bash in sandbox per agenti AI in PHP
BashBox è un interprete bash scritto in puro PHP che permette di eseguire gli script generati dagli agenti AI senza mai ricorrere a proc_open, exec o shell_exec. Ogni comando è una classe PHP che lavora su un filesystem virtuale, con limiti di esecuzione, quote disco e accesso di rete configurabili. Ideale per chi sviluppa agenti con il Laravel AI SDK o altre librerie simili.