Skip to main content

Cosa sono le regole di validazione personalizzate

Laravel offre molte regole di validazione integrate, ma a volte serve una logica di validazione specifica dell’applicazione. Le regole personalizzate permettono di definire logica riutilizzabile come classe o closure, e usarla al pari delle regole standard. Ci sono due modi principali per definire una regola personalizzata.
  • Oggetti Rule — molto riutilizzabili e facili da testare
  • Closure — indicate per regole semplici usate una sola volta

Oggetti Rule

Generare la classe della regola

Con il comando Artisan make:rule generi una nuova classe di regola. La classe viene creata in app/Rules.

Implementare l’interfaccia ValidationRule

Nella classe generata implementi il metodo validate. Il metodo, in caso di fallimento, invoca la closure $fail.
Nel messaggio passato a $fail puoi usare il placeholder :attribute. Laravel lo sostituisce con il nome del campo.

Applicare l’oggetto Rule

Passi un’istanza dell’oggetto Rule nell’array di validazione.
Puoi usarla allo stesso modo nel metodo rules() di una form request.

Messaggi di errore tramite chiavi di traduzione

Al posto di hardcodare il messaggio, puoi usare una chiave di traduzione.
Aggiungi il messaggio al file di traduzione lang/it/validation.php.

Aggiungere più messaggi di errore

Per riportare più errori sullo stesso campo, chiami $fail più volte.

Regole basate su closure

Le regole semplici usate una sola volta nell’applicazione possono essere definite come closure, senza creare una classe.
Le regole con closure sono comode perché inline, ma sono difficili da riusare e testare in isolamento. Per logica usata in più punti conviene estrarla in un oggetto Rule.

Regole implicite (eseguite anche con valore vuoto)

Di default, se il campo è vuoto o assente, le regole personalizzate non vengono eseguite. Se vuoi eseguirle anche sui valori vuoti, genera la classe con l’opzione --implicit.
La classe generata implementa l’interfaccia ImplicitRule. Questa interfaccia non aggiunge metodi: funziona come segnale per Laravel.
ImplicitRule segnala a Laravel che “l’attributo è obbligatorio”. Se far fallire davvero la validazione con valore vuoto o meno dipende dall’implementazione di validate.

Accesso ai dati

DataAwareRule — accedere a tutti i dati del form

Se vuoi validare in base al valore di altri campi, implementa l’interfaccia DataAwareRule. Il metodo setData viene chiamato automaticamente prima dell’esecuzione della regola.
Esempio d’uso:

ValidatorAwareRule — accedere all’istanza del Validator

Per accedere a tutte le informazioni del Validator (regole già fallite, messaggi personalizzati, ecc.) implementa l’interfaccia ValidatorAwareRule.

Casi d’uso pratici

Verifica di caratteri giapponesi

Regola che verifica il tipo di caratteri (mezza/piena larghezza).

Validazione del formato di un numero di telefono

Regola per verificare il formato dei numeri di telefono giapponesi.

Vincolo di unicità per tenant

Vincolo di unicità nell’ambito del tenant, tipico delle applicazioni multi-tenant.
1

Creare la classe della regola

2

Usarla in una form request

3

In update: escludere l'ID

Per aggiornare un record esistente, escludi il proprio ID dal controllo di duplicazione.

Registrazione delle regole nel service provider

Aggiungere regole con Validator::extend()

Con Validator::extend() puoi usare la regola personalizzata in forma di stringa ('rule_name'). La registri nel metodo boot() di AppServiceProvider.
Le regole registrate con Validator::extend() si indicano come stringa.
Validator::extend() è la modalità di registrazione più vecchia. Per nuovi sviluppi consigliamo l’uso di oggetti Rule che implementano ValidationRule.

Aggiungere come metodo statico sulla classe Rule

Aggiungendo una macro alla facade Rule puoi offrire un’API fluent come Rule::myRule().

Dettagli dell’implementazione interna

Vediamo come Illuminate\Validation\Validator invoca le regole personalizzate. Nel Validator, validateAttribute() elabora ogni campo. Se la regola implementa ValidationRule, viene invocato il metodo validateUsingCustomRule().
La gestione di ImplicitRule avviene tramite il metodo isImplicit(): se il valore è vuoto, la regola viene comunque eseguita.
Puoi implementare contemporaneamente DataAwareRule e ValidatorAwareRule. In una classe che implementa entrambe le interfacce vengono eseguite entrambe le iniezioni.

Pagine correlate

Validazione (introduzione)

Rivedi le modalità di validazione standard in controller e form request.
Ultima modifica il 13 luglio 2026