Saltar al contenido principal

¿Qué es la validación?

Validar consiste en comprobar que los datos enviados por el usuario cumplen el formato y las condiciones esperadas. Laravel ofrece validación sencilla y potente mediante el método validate del objeto Request o mediante clases form request dedicadas.

Validación en el controlador

Uso de $request->validate()

Llamar a $request->validate() en el método del controlador es la forma más sencilla. Ante un fallo, Laravel redirige automáticamente a la pantalla anterior y guarda los errores en la sesión. Define las rutas:
use App\Http\Controllers\PostController;

Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);
Crea el controlador:
<?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',
        ]);

        // Guarda el post con los datos validados...

        return redirect('/posts');
    }
}
validate recibe un array cuya clave es el campo y cuyo valor son las reglas. Las reglas se separan con | o se pasan como array.
// Separadas por tuberías
'title' => 'required|string|max:255',

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

Reglas de validación principales

ReglaDescripción
requiredEl valor está presente y no vacío
stringEs un string
emailFormato de correo válido
min:valorLongitud o valor numérico mínimo
max:valorLongitud o valor numérico máximo
unique:tablaEl valor es único en la tabla
nullableSe permite null
integerEs entero
booleanBooleano (true/false, 1/0, etc.)
dateFormato de fecha válido
confirmedCoincide con el campo nombre_confirmation
Consulta la lista completa en la documentación oficial.

Uso de los datos validados

El retorno de validate es un array solo con los datos que pasaron la validación. Puedes usarlos como datos de confianza.
$validated = $request->validate([
    'title' => 'required|string|max:255',
    'body'  => 'required|string',
]);

// $validated con formato ['title' => '...', 'body' => '...']
Post::create($validated);

Mostrar errores en Blade

Ante un fallo, Laravel hace la variable $errors disponible en todas las vistas. Lo gestiona el middleware ShareErrorsFromSession del grupo web.

Listar todos los errores

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

Mostrar el error de un campo

Con la directiva @error muestras el error de un campo en línea.
<label for="title">Título</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('nombre_del_campo') puedes volver a rellenar el valor introducido por el usuario tras un fallo de validación.

Form requests

¿Qué es una form request?

Cuando la lógica de validación se vuelve compleja, extraerla a una clase “form request” es una buena opción. Una form request es una clase de solicitud personalizada que agrupa validación y autorización.

Crear una form request

Genera la clase con el comando Artisan make:request.
php artisan make:request StorePostRequest
Se crea app/Http/Requests/StorePostRequest.php.
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * Determina si el usuario está autorizado a realizar esta solicitud
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Devuelve las reglas de validación a aplicar
     *
     * @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',
        ];
    }
}

El método rules()

Devuelve las reglas de validación como array. El formato es el mismo que en validate.

El método authorize()

Determina si la solicitud está autorizada. Si devuelve true, la autorización pasa; si devuelve false, se responde automáticamente con 403. Para permitir solo a usuarios autenticados, puedes comprobar con auth()->check(). En tutoriales basta con devolver true.
Si authorize devuelve false, el método del controlador no se ejecuta y se responde 403 Forbidden.

Inyección en el controlador

Basta con tipar la form request en el método del controlador para usarla. La validación se ejecuta antes de entrar al método, así que no necesitas escribir código de validación dentro.
use App\Http\Requests\StorePostRequest;

class PostController extends Controller
{
    public function store(StorePostRequest $request): RedirectResponse
    {
        // Al llegar aquí, ya se validó

        $validated = $request->validated();

        Post::create($validated);

        return redirect('/posts');
    }
}
Con $request->validated() obtienes solo los datos validados.

Ejemplo práctico: crear y guardar un formulario de post

Flujo completo de visualización, envío, validación y guardado.
1

Definir las rutas

use App\Http\Controllers\PostController;

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

Crear la 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

Implementar el controlador

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

Crear la plantilla Blade

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

<h1>Nuevo 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">Título</label>
        <input
            id="title"
            type="text"
            name="title"
            value="{{ old('title') }}"
        />
        @error('title')
            <span>{{ $message }}</span>
        @enderror
    </div>

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

    <button type="submit">Publicar</button>
</form>
Incluye siempre @csrf en los formularios Blade. Sin el token CSRF, Laravel devuelve un error 419.

Próximos pasos

Solicitudes HTTP

Repasa cómo obtener datos del objeto Request.
Última modificación el 13 de julio de 2026