La validación de Laravel permite comprobar los datos de una petición mediante reglas declarativas.
Laravel tiene un sistema de validación integrado en el propio objeto Request. Tú defines las reglas (qué es lo que aceptas) y Laravel se encarga de hacer de “policía malo”.
El método $request->validate()
Imagina que recibimos un producto. Tiene que tener nombre (obligatorio), precio (numérico) y un código SKU (que debe ser único en la tabla de productos).
Código antiguo (PHP Clásico - Pesadilla):
if (empty($_POST['nombre'])) {
$errores[] = "El nombre es obligatorio";
}
if (!is_numeric($_POST['precio'])) {
$errores[] = "El precio debe ser número";
}
// ... conectar a BD para ver si el SKU existe ...
if (count($errores) > 0) {
// Redirigir y pasar errores...
}Código Laravel (Paraíso): Dentro de tu método en el controlador:
public function store(Request $request)
{
// Una sola línea (o bloque) que lo hace TODO
$datosValidados = $request->validate([
'nombre' => 'required|max:255',
'precio' => 'required|numeric|min:0',
'sku' => 'required|unique:productos,sku', // ¡Verifica en la BD automáticamente!
]);
// Si el código llega aquí, es que TODO es válido.
// Si falla, Laravel detiene la ejecución aquí mismo.
// El modelo debe permitir estos campos mediante $fillable
// o una configuración equivalente de asignación masiva.
Producto::create($datosValidados);
return redirect('/productos');
}¿Qué pasa si la validación falla?
Lo brillante de $request->validate() es lo que no ves. Si una regla no se cumple (ej: el usuario dejó el nombre vacío):
Laravel detecta el fallo.
Detiene la ejecución del script inmediatamente (no sigue a la línea de guardar).
Redirige al usuario automáticamente a la página anterior (donde estaba el formulario).
Inyecta los errores en la sesión para que puedas mostrarlos.
Recuerda los datos que el usuario escribió (old input) para que no tenga que volver a escribir todo el formulario.
¡Todo eso automático y sin escribir ni un if!
Las reglas más comunes
Laravel tiene cientos de reglas listas para usar. Se separan por una barra vertical |.
| Regla | Descripción |
|---|---|
required | El campo no puede estar vacío. |
email | Debe ser un formato de correo válido. |
numeric / integer | Solo números. |
min:5 / max:255 | Longitud mínima o máxima (o valor numérico). |
confirmed | Busca otro campo llamado _confirmation y comprueba que sean iguales (ideal para contraseñas). |
unique:tabla,columna | Comprueba en la Base de Datos que ese valor no exista ya. |
date / after:tomorrow | Validaciones de fechas. |
Mostrando los errores en la vista (Blade)
De nada sirve validar si el usuario no sabe qué ha hecho mal. Laravel comparte automáticamente una variable $errors con todas tus vistas.
A. Mostrar una lista general de errores:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endifB. Mostrar error debajo de cada input (Recomendado):
Además, usamos la función old('nombre_campo') para rellenar lo que el usuario escribió antes de equivocarse.
<label>Nombre del Producto:</label>
<input type="text" name="nombre" value="{{ old('nombre') }}">
@error('nombre')
<span style="color: red;">{{ $message }}</span>
@enderror