La convalida dati di laravel migliora con le regole personalizzate

Nello sviluppo di progetti software, le regole di convalida dati, sono un passaggio fondamentale che ci assicura la correttezza dei dati in input.
Spesso però ci troviamo a lavorare con strumenti, o in scenari in cui le regole di validazione integrate non sono sufficienti.
Il sistema di convalida dei dati di Laravel ha una serie di regole di base, che può essere arricchita con le regole personalizzate, che ci consentono di creare una logica di convalida riutilizzabile e testabile per le nostre applicazioni.
Vediamo in questo articolo come creare e utilizzare regole di convalida dati personalizzate in Laravel.
3 minuti
Perché utilizzare regole di convalida dati personalizzate?
L’uso di regole di convalida dati personalizzate in Laravel, offre diversi vantaggi:
- Riutilizzabilità in tutta la tua applicazione
- Incapsulamento della logica di convalida complessa
- Test più semplice delle regole
- Codice più pulito e leggibile
Creazione di una regola di convalida dati personalizzata
Creiamo una regola personalizzata per convalidare le password complesse, e per farlo utilizziamo il seguente comando:
php artisan make:rule StrongPassword
Successivamente andiamo a personalizzare il metodo passes() dove specifichiamo la regola di accettazione, e il metodo message() dove specifichiamo il messaggio da visualizzare quando la regola non è rispettata
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class StrongPassword implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
// Password must be at least 8 characters and contain at least one uppercase letter, one lowercase letter, and one number
return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute must be at least 8 characters and contain at least one uppercase letter, one lowercase letter, and one number.';
}
}Utilizzo della regola personalizzata
Puoi utilizzare questa regola personalizzata nelle richieste dei moduli, nei controller o ovunque tu esegua la convalida dati. Qui di seguito ti riporto due esempi di utilizzo della regola StrongPassword, sia nella form request che nel controller.
use App\Rules\StrongPassword;
// In a form request
public function rules()
{
return [
'password' => ['required', new StrongPassword],
];
}
// In a controller
public function store(Request $request)
{
$request->validate([
'password' => ['required', new StrongPassword],
]);
// Process the validated data...
}Tecniche avanzate
Regole parametrizzate
Puoi rendere le tue regole personalizzate più flessibili accettando i parametri. Nell’esempio successivo abbiamo una regola per l’accettazione di un numero “parametrizzato” di parole minimo. Il parametro “numero di parole” viene impostato nel metodo costruttore:
class MinWords implements Rule
{
private $minWords;
public function __construct($minWords)
{
$this->minWords = $minWords;
}
public function passes($attribute, $value)
{
return str_word_count($value) >= $this->minWords;
}
public function message()
{
return "The :attribute must contain at least {$this->minWords} words.";
}
}
// Usage
'description' => ['required', new MinWords(5)]
Utilizzo delle dipendenze
Se la tua regola deve interagire con altri servizi o con il database, puoi utilizzare il contenitore di servizi di Laravel:
class UniqueInOrganization implements Rule
{
private $organization;
public function __construct($organization)
{
$this->organization = $organization;
}
public function passes($attribute, $value)
{
return !User::where('organization_id', $this->organization->id)
->where($attribute, $value)
->exists();
}
public function message()
{
return 'The :attribute has already been taken within your organization.';
}
}
Test delle regole di convalida dati personalizzate
Uno dei principali vantaggi delle regole personalizzate è che sono facilmente testabili:
use App\Rules\StrongPassword;
class StrongPasswordTest extends TestCase
{
/** @test */
public function it_passes_for_strong_passwords()
{
$rule = new StrongPassword;
$this->assertTrue($rule->passes('password', 'StrongPass1'));
$this->assertFalse($rule->passes('password', 'weakpass'));
}
}








