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.
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:
<?phpnamespace 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'],
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.
Genera la clase con el comando Artisan make:request.
php artisan make:request StorePostRequest
Se crea app/Http/Requests/StorePostRequest.php.
<?phpnamespace 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', ]; }}
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.
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'); }}