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 Artisanmake:rule generi una nuova classe di regola. La classe viene creata in app/Rules.
Implementare l’interfaccia ValidationRule
Nella classe generata implementi il metodovalidate. Il metodo, in caso di fallimento, invoca la closure $fail.
$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.rules() di una form request.
Messaggi di errore tramite chiavi di traduzione
Al posto di hardcodare il messaggio, puoi usare una chiave 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.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.
ImplicitRule. Questa interfaccia non aggiunge metodi: funziona come segnale per Laravel.
Accesso ai dati
DataAwareRule — accedere a tutti i dati del form
Se vuoi validare in base al valore di altri campi, implementa l’interfacciaDataAwareRule. Il metodo setData viene chiamato automaticamente prima dell’esecuzione della regola.
ValidatorAwareRule — accedere all’istanza del Validator
Per accedere a tutte le informazioni del Validator (regole già fallite, messaggi personalizzati, ecc.) implementa l’interfacciaValidatorAwareRule.
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()
ConValidator::extend() puoi usare la regola personalizzata in forma di stringa ('rule_name'). La registri nel metodo boot() di AppServiceProvider.
Validator::extend() si indicano come stringa.
Aggiungere come metodo statico sulla classe Rule
Aggiungendo una macro alla facadeRule puoi offrire un’API fluent come Rule::myRule().
Dettagli dell’implementazione interna
Vediamo comeIlluminate\Validation\Validator invoca le regole personalizzate.
Nel Validator, validateAttribute() elabora ogni campo. Se la regola implementa ValidationRule, viene invocato il metodo validateUsingCustomRule().
ImplicitRule avviene tramite il metodo isImplicit(): se il valore è vuoto, la regola viene comunque eseguita.
Pagine correlate
Validazione (introduzione)
Rivedi le modalità di validazione standard in controller e form request.