Middleware
En Laravel, el middleware es un mecanismo que permite interceptar las solicitudes HTTP antes de que lleguen al controlador o después de que se genere la respuesta. Se utiliza para ejecutar lógica transversal, como autenticación, autorización, logging, manejo de errores o transformación de datos.
Concepto y propósito
Un middleware puede:
- Ejecutar código antes o después de que la solicitud llegue al controlador.
- Modificar los objetos de solicitud (
Request) o respuesta (Response). - Detener la solicitud y devolver una respuesta directamente.
- Pasar el control al siguiente middleware mediante
$next($request).
Middleware global y de ruta
Middleware global
Se aplica a todas las rutas de la aplicación y se registra en app/Http/Kernel.php dentro del array $middleware:
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
Middleware por ruta o grupo
Se puede asignar a rutas individuales o grupos de rutas:
Route::middleware(['auth'])->group(function () {
Route::get('/perfil', function () {
return 'Perfil del usuario';
});
Route::get('/dashboard', function () {
return 'Panel de administración';
});
});
También se puede aplicar directamente a una ruta específica:
Route::get('/admin', function () {
return 'Administración';
})->middleware('auth', 'checkRole:admin');
Creación de middleware personalizado
Para crear un middleware propio:
php artisan make:middleware VerificarRol
Ejemplo de middleware que verifica el rol del usuario:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class VerificarRol
{
public function handle(Request $request, Closure $next, $rol)
{
if ($request->user()->rol !== $rol) {
return response()->json(['mensaje' => 'No autorizado'], 403);
}
return $next($request);
}
}
Registrar el middleware en app/Http/Kernel.php dentro de $routeMiddleware:
'checkRole' => \App\Http\Middleware\VerificarRol::class,
Buenas prácticas y convenciones
- Mantener el middleware enfocado en una sola responsabilidad.
- Reutilizar middleware para lógica común entre varias rutas o controladores.
- Evitar lógica de negocio compleja dentro del middleware; delegar a servicios.
- Nombrar middleware de manera descriptiva según su función (
auth,checkRole,logRequests). - Aplicar middleware global solo para tareas transversales necesarias y middleware por ruta para casos específicos.