Middleware
Los middleware son filtros que inspeccionan y modifican las peticiones HTTP antes de que lleguen a tu controlador. Son perfectos para autenticación, logging o validaciones globales.
¿Qué es un middleware?
Imagina un middleware como un guardia de seguridad. Cada petición debe pasar por él antes de llegar a tu aplicación. El middleware puede dejar pasar la petición, modificarla o rechazarla.
Laravel incluye varios middleware por defecto: autenticación, protección CSRF, manejo de cookies, etc.
Crear un middleware
Usa Artisan para generar un middleware:
php artisan make:middleware CheckAge
Esto crea
app/Http/Middleware/CheckAge.php:
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class CheckAge
{
public function handle(Request $request, Closure $next): Response
{
if ($request->input('age') < 18) {
return response('No autorizado', 403);
}
return $next($request);
}
}
El método handle() recibe la
petición y un closure $next. Si
todo está bien, llama a
$next($request) para continuar.
Registrar el middleware
En Laravel 11+, registra el middleware en
bootstrap/app.php:
use App\Http\Middleware\CheckAge;
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'check.age' => CheckAge::class,
]);
})
Aplicar middleware a rutas
Hay varias formas de aplicar middleware:
// A una ruta individual
Route::get('/adultos', function () {
return 'Contenido para adultos';
})->middleware('check.age');
// A un grupo de rutas
Route::middleware(['check.age'])->group(function () {
Route::get('/bar', function () { /* ... */ });
Route::get('/casino', function () { /* ... */ });
});
Middleware con parámetros
Puedes pasar parámetros al middleware:
// En el middleware
public function handle(Request $request, Closure $next, int $minAge): Response
{
if ($request->input('age') < $minAge) {
return response('No autorizado', 403);
}
return $next($request);
}
// En la ruta
Route::get('/bar', function () {
return 'Bienvenido al bar';
})->middleware('check.age:21');
Middleware globales
Algunos middleware se aplican a todas las
peticiones. Se configuran en
bootstrap/app.php:
->withMiddleware(function (Middleware $middleware) {
$middleware->append(LogRequests::class);
})
Laravel incluye middleware como
auth (autenticación),
throttle (límite de
peticiones) y
verified (email
verificado).
Ejercicios
Ejercicio 1: Middleware de logging
Crea un middleware LogRequest que
escriba en el log la URL y el método de cada
petición.
Ver solución
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\Response;
class LogRequest
{
public function handle(Request $request, Closure $next): Response
{
Log::info('Petición recibida', [
'url' => $request->url(),
'method' => $request->method(),
]);
return $next($request);
}
}
Ejercicio 2: Middleware de mantenimiento
Crea un middleware que devuelva "Sitio en
mantenimiento" con código 503 si existe un
archivo storage/maintenance.
Ver solución
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\Response;
class CheckMaintenance
{
public function handle(Request $request, Closure $next): Response
{
if (file_exists(storage_path('maintenance'))) {
return response('Sitio en mantenimiento', 503);
}
return $next($request);
}
}
Ejercicio 3: Middleware con parámetro de rol
Crea un middleware que reciba un parámetro
role y solo permita el acceso si el
query string contiene
?role=admin (o el rol
especificado).
Ver solución
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class CheckRole
{
public function handle(Request $request, Closure $next, string $role): Response
{
if ($request->query('role') !== $role) {
return response('Acceso denegado', 403);
}
return $next($request);
}
}
// Uso: Route::get('/admin', ...)->middleware('check.role:admin');
Resumen
En esta lección aprendiste:
- Los middleware filtran peticiones antes de llegar al controlador
-
php artisan make:middlewaregenera middleware -
Se registran en
bootstrap/app.php(Laravel 11+) -
->middleware('nombre')aplica a rutas -
Pueden recibir parámetros con
middleware('nombre:param')
En la siguiente lección aprenderás a usar Artisan CLI, la herramienta de línea de comandos de Laravel.
¿Has encontrado un error o tienes una sugerencia para mejorar esta lección?
Escríbenos¿Te está gustando el curso?
Tenemos cursos premium con proyectos reales, soporte personalizado y certificado.
Descubrir cursos premium