Vai al contenuto principale

Cos’è la validazione

La validazione consiste nel verificare che i dati inviati dall’utente soddisfino il formato e le condizioni attese. Laravel offre una funzionalità di validazione semplice e potente tramite il metodo validate dell’oggetto request o tramite classi form request dedicate.

Validazione nel controller

Uso di $request->validate()

Chiamare $request->validate() all’interno del metodo del controller è il modo più semplice di validare. Se la validazione fallisce, Laravel reindirizza automaticamente l’utente alla schermata precedente e salva gli errori in sessione. Definisci le route.
use App\Http\Controllers\PostController;

Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);
Crea il controller.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class PostController extends Controller
{
    public function create(): View
    {
        return view('post.create');
    }

    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'body'  => 'required|string',
            'email' => 'required|email',
        ]);

        // Salva il post con i dati validati...

        return redirect('/posts');
    }
}
Al metodo validate passi un array con nome del campo come chiave e regole come valore. Puoi separare le regole con il pipe | o indicarle come array.
// Separazione con pipe
'title' => 'required|string|max:255',

// Formato array
'title' => ['required', 'string', 'max:255'],

Regole di validazione principali

RegolaDescrizione
requiredIl valore deve esistere e non essere vuoto
stringDeve essere una stringa
emailDeve essere un’email valida
min:valoreLunghezza minima della stringa o valore minimo del numero
max:valoreLunghezza massima della stringa o valore massimo del numero
unique:tabellaIl valore deve essere univoco nella tabella indicata
nullableConsente anche il valore null
integerDeve essere un intero
booleanDeve essere un valore booleano (true/false, 1/0, ecc.)
dateDeve essere una data valida
confirmedDeve corrispondere al campo nomecampo_confirmation
Puoi consultare tutte le regole disponibili nella documentazione ufficiale.

Uso dei dati validati

Il valore restituito da validate è un array che contiene solo i dati che hanno superato la validazione. Puoi usarli in modo sicuro come dati affidabili.
$validated = $request->validate([
    'title' => 'required|string|max:255',
    'body'  => 'required|string',
]);

// $validated ha la forma ['title' => '...', 'body' => '...']
Post::create($validated);

Visualizzazione degli errori in Blade

Se la validazione fallisce, Laravel rende automaticamente disponibile in tutte le viste la variabile $errors. Se ne occupa il middleware ShareErrorsFromSession incluso nel gruppo web.

Mostrare tutti gli errori in un elenco

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

Mostrare gli errori per singolo campo

Con la direttiva @error puoi mostrare inline l’errore di un campo specifico.
<label for="title">Titolo</label>

<input
    id="title"
    type="text"
    name="title"
    value="{{ old('title') }}"
    class="@error('title') is-invalid @enderror"
/>

@error('title')
    <div class="error-message">{{ $message }}</div>
@enderror
Con old('nomecampo') puoi ripopolare il form con i valori inseriti dall’utente anche dopo un fallimento della validazione.

Form request

Cosa sono le form request

Quando la logica di validazione diventa complessa, è utile estrarla in classi “form request”. Una form request è una classe request personalizzata che raccoglie in un’unica classe la logica di validazione e di autorizzazione.

Creazione di una form request

Genera una classe form request con il comando Artisan make:request.
php artisan make:request StorePostRequest
Viene generato app/Http/Requests/StorePostRequest.php.
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * Determina se l'utente ha il diritto di eseguire questa richiesta
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Restituisce le regole di validazione da applicare a questa richiesta
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'title' => 'required|string|max:255',
            'body'  => 'required|string',
            'email' => 'required|email|unique:posts',
        ];
    }
}

Metodo rules()

Restituisce le regole di validazione come array. Stesso formato dell’array passato a validate del controller.

Metodo authorize()

Determina se l’utente è autorizzato a eseguire la richiesta. Restituendo true l’autorizzazione è concessa; restituendo false viene restituita automaticamente una response 403. Se vuoi consentire solo agli utenti autenticati puoi verificare con auth()->check(). Nel tutorial è sufficiente restituire true.
Se authorize restituisce false, il metodo del controller non viene eseguito e viene restituita una response 403 Forbidden.

Iniezione nel controller

Basta indicare la form request come type hint del metodo del controller. La validazione viene eseguita prima che il controller venga chiamato, quindi non serve scriverla nel metodo.
use App\Http\Requests\StorePostRequest;

class PostController extends Controller
{
    public function store(StorePostRequest $request): RedirectResponse
    {
        // Se sei qui, la validazione è già passata

        $validated = $request->validated();

        Post::create($validated);

        return redirect('/posts');
    }
}
Con $request->validated() ottieni solo i dati validati.

Esempio pratico: creazione e salvataggio di un form di post

Il flusso completo dalla visualizzazione del form all’invio, validazione e salvataggio.
1

Definizione delle route

use App\Http\Controllers\PostController;

Route::get('/posts/create', [PostController::class, 'create']);
Route::post('/posts', [PostController::class, 'store']);
2

Creazione della form request

php artisan make:request StorePostRequest
public function rules(): array
{
    return [
        'title' => 'required|string|max:255',
        'body'  => 'required|string',
    ];
}

public function authorize(): bool
{
    return true;
}
3

Implementazione del controller

use App\Http\Requests\StorePostRequest;
use App\Models\Post;

class PostController extends Controller
{
    public function create(): View
    {
        return view('posts.create');
    }

    public function store(StorePostRequest $request): RedirectResponse
    {
        Post::create($request->validated());

        return redirect('/posts');
    }
}
4

Creazione del template Blade

{{-- resources/views/posts/create.blade.php --}}

<h1>Nuovo post</h1>

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

<form method="POST" action="/posts">
    @csrf

    <div>
        <label for="title">Titolo</label>
        <input
            id="title"
            type="text"
            name="title"
            value="{{ old('title') }}"
        />
        @error('title')
            <span>{{ $message }}</span>
        @enderror
    </div>

    <div>
        <label for="body">Corpo</label>
        <textarea id="body" name="body">{{ old('body') }}</textarea>
        @error('body')
            <span>{{ $message }}</span>
        @enderror
    </div>

    <button type="submit">Pubblica</button>
</form>
Nei form Blade includi sempre la direttiva @csrf. Senza il token CSRF Laravel restituisce l’errore 419.

Prossimi passi

Richieste HTTP

Rivedi come ottenere i dati usando l’oggetto request.
Ultima modifica il 13 luglio 2026