Saltar al contenido principal

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, LogRequests o CheckRole.
  • Registrar solo los middleware necesarios para no afectar el rendimiento de la aplicación.