Aprende Laravel: Validación

En el proyecto del blog ya validaste datos por encima. Ahora vamos a fondo: validar es asegurarte de que los datos que entran cumplen tus reglas antes de usarlos (guardar en base de datos, procesar, etc.). Laravel te da dos formas principales: validar directo en el controller y, para reglas más complejas, los Form Requests.
Validación en el controller
La forma más directa es el método validate() sobre el $request:
public function store(Request $request): RedirectResponse
{
$validated = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
// Los datos son válidos...
Post::create($validated);
return redirect('/posts');
}Si la validación falla, Laravel redirige automáticamente al formulario anterior con los errores en la sesión. No tienes que escribir ese manejo tú. Si pasa, validate() devuelve solo los datos validados (útil para pasarlos directo a create()).
Reglas más comunes
| Regla | Qué hace |
|---|---|
required |
El campo debe estar presente y no vacío |
unique:posts |
El valor debe ser único en la tabla posts |
email |
Debe ser un email válido |
max:255 |
No puede exceder 255 caracteres |
min:3 |
Al menos 3 caracteres |
confirmed |
Debe tener un campo {campo}_confirmation que coincida |
nullable |
El campo puede ser nulo |
date |
Debe ser una fecha válida |
integer |
Debe ser un entero |
Las reglas se combinan en un array por campo. La lista completa está en la documentación oficial.
Mostrar los errores en Blade
La variable $errors está disponible en todas las vistas automáticamente. Para mostrar todos los errores:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endifY para el error de un campo puntual, la directiva @error:
<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="text-red-600">{{ $message }}</div>
@enderrorEl helper old('title') repuebla el input con lo que el usuario había escrito, así no pierde el formulario cuando falla la validación.
Form Requests: sacar la validación del controller
Cuando las reglas crecen, meterlas en el controller lo ensucia. Un Form Request es una clase dedicada a validar (y autorizar) una petición. Se genera con Artisan:
php artisan make:request StorePostRequestSe crea en app/Http/Requests con dos métodos clave, authorize() y rules():
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
public function authorize(): bool
{
// ¿Este usuario puede hacer esta petición?
return true;
}
public function rules(): array
{
return [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
'publish_at' => ['nullable', 'date'],
];
}
}Luego lo type-hinteas en el controller y Laravel valida antes de entrar al método. Si falla, redirige solo; si pasa, ya tienes los datos validados:
public function store(StorePostRequest $request): RedirectResponse
{
// Si llegaste aquí, la petición es válida.
$validated = $request->validated();
// O solo una parte:
$data = $request->safe()->only(['title', 'body']);
Post::create($validated);
return redirect('/posts');
}El controller queda limpio: recibe datos ya validados y se concentra en su lógica.
Mensajes y atributos personalizados
Dentro del Form Request puedes sobrescribir messages() y attributes() para textos a medida:
public function messages(): array
{
return [
'title.required' => 'El título es obligatorio.',
'title.unique' => 'Ya existe un post con ese título.',
];
}
public function attributes(): array
{
return [
'title' => 'título del post',
];
}Siguiente Paso
Ya sabes validar lo que entra. El siguiente fundamento es saber quién entra: cómo registrar usuarios, iniciar sesión y proteger rutas. Sigue con Aprende Laravel: Autenticación.
Preguntas Frecuentes
¿Cuándo uso $request->validate() y cuándo un Form Request?
Usa $request->validate() para validaciones simples y puntuales. Pasa a un Form Request cuando las reglas crecen, se repiten entre métodos, o necesitas lógica de autorización junto con la validación.
¿Qué pasa si la validación falla?
Laravel redirige automáticamente a la página anterior con los mensajes de error en la sesión (la variable $errors) y repuebla los inputs con old(). No tienes que manejar la redirección a mano.
¿Cómo muestro el error de un solo campo?
Con la directiva @error('campo') ... {{ $message }} ... @enderror en Blade. La variable $errors también te deja recorrer todos con $errors->all().
¿El método authorize() del Form Request es obligatorio?
Existe siempre, pero si no necesitas lógica de permisos, devuelve true. Si devuelve false, Laravel responde con un 403 antes de validar.