notiziephp.it

Novità in Symfony 8.2: Form basati su attributi (Symfony Blog)

Traduzione da Symfony Blog
18 Settembre 2026 Tempo di lettura: 2 minuti
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.

Condividi su: LinkedIn

Altri articoli recenti