Middleware
El middleware en Lumen es un mecanismo que permite interceptar las solicitudes HTTP antes de que lleguen a los controladores o después de que se generen las respuestas. Se utiliza para aplicar lógica transversal en la aplicación, como autenticación, autorización, logging, validación de datos o manejo de CORS.
Concepto y propósito
Un middleware es básicamente una función o clase que recibe la solicitud (Request) y decide cómo procesarla, pudiendo:
- Continuar con la ejecución de la ruta y pasar la solicitud al siguiente middleware o controlador.
- Modificar la solicitud o respuesta.
- Detener la ejecución y devolver una respuesta directamente.
Los middleware son fundamentales para mantener la lógica común centralizada y evitar repetir código en múltiples rutas o controladores.
Middleware global y por ruta
En Lumen se pueden definir middleware de dos formas:
Middleware global
Se ejecuta en todas las solicitudes de la aplicación. Se registra en bootstrap/app.php:
$app->middleware([
App\Http\Middleware\CheckAge::class,
]);
Este middleware se aplicará automáticamente a todas las rutas.
Middleware por ruta
Se aplica solo a rutas o grupos específicos usando el método middleware():
$router->get('/perfil', ['middleware' => 'auth', function () {
return 'Página de perfil';
}]);
También se pueden aplicar a grupos de rutas:
$router->group(['middleware' => 'auth'], function () use ($router) {
$router->get('/usuarios', 'UsuarioController@listar');
$router->post('/usuarios', 'UsuarioController@crear');
});
Creación de un middleware
Un middleware se crea como clase dentro de app/Http/Middleware. Ejemplo:
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
public function handle($request, Closure $next)
{
if ($request->input('edad') < 18) {
return response('No autorizado', 403);
}
return $next($request);
}
}
Este middleware verifica que la edad en la solicitud sea mayor o igual a 18 antes de permitir que la solicitud continúe.
Buenas prácticas y convenciones en middleware
- Mantener middleware específicos para tareas concretas, evitando combinar múltiples responsabilidades.
- Reutilizar middleware para lógica común entre varias rutas o controladores.
- Evitar lógica de negocio compleja dentro del middleware; delegar a servicios o modelos.
- Nombrar las clases de manera clara indicando su función, por ejemplo
Authenticate,LogRequestsoCheckRole. - Registrar solo los middleware necesarios para no afectar el rendimiento de la aplicación.