Hilar fino en la ejecución de los middlewares de Laravel: dominio de la prioridad
- Publicado el 31 octubre, 2024
- Palabras: 491
En el mundo del desarrollo de aplicaciones de Laravel, el middleware desempeña un papel crucial en el procesamiento de solicitudes HTTP. Si bien el orden de ejecución del middleware generalmente está determinado por el orden en el que se asignan a las rutas, existen situaciones en las que se necesita un control más granular. Aquí es donde entra en juego la función de prioridad del middleware de Laravel. Profundicemos en cómo puede aprovechar esta poderosa herramienta para ajustar el flujo de procesamiento de solicitudes de su aplicación.

#Comprendiendo el Middleware Priority
El middleware priority le permite especificar un orden de ejecución global para su middleware, independientemente del orden en el que se asignan a las rutas. Esto es particularmente útil cuando tiene middleware que debe ejecutarse antes que otros, pero no tiene control sobre su orden de asignación en varias partes de su aplicación.
#Configurar el Middleware Priority
Para configurar el middleware priority, deberá utilizar el método priority en el archivo bootstrap/app.php de su aplicación. A continuación, le indicamos cómo hacerlo:
->withMiddleware(function (Middleware $middleware) {
$middleware->priority([
IlluminateFoundationHttpMiddlewareHandlePrecognitiveRequests::class,
IlluminateCookieMiddlewareEncryptCookies::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
IlluminateFoundationHttpMiddlewareValidateCsrfToken::class,
IlluminateRoutingMiddlewareSubstituteBindings::class,
IlluminateAuthMiddlewareAuthorize::class,
]);
})
En este ejemplo, establecemos un orden de prioridad para varios middlewares básicos de Laravel. El middleware que aparece primero se ejecutará primero, independientemente de cómo se asignen a las rutas.
#Ejemplo práctico
Consideremos un escenario en el que estamos creando una aplicación web con algún middleware personalizado para el registro, la autenticación y la limitación de solicitudes. Queremos asegurarnos de que el registro se realice primero, seguido de la autenticación y luego la limitación, independientemente de cómo se asignen estos middlewares a las rutas.
A continuación, se muestra cómo podríamos configurarlo:
// In bootstrap/app.php
use AppHttpMiddlewareCustomLogger;
use AppHttpMiddlewareCustomAuthenticator;
use AppHttpMiddlewareCustomThrottler;
->withMiddleware(function (Middleware $middleware) {
$middleware->priority([
CustomLogger::class,
CustomAuthenticator::class,
CustomThrottler::class,
// ... other middleware
]);
})
Ahora veamos cómo esto podría afectar nuestro manejo de solicitudes:
// In a controller
public function index(Request $request)
{
// This action is protected by our custom middleware
return response()->json(['message' => 'Welcome to the dashboard']);
}
// In routes/web.php
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware(['custom.throttle', 'custom.auth', 'custom.log']);
Aunque hemos asignado el middleware en el orden custom.throttle, custom.auth, custom.log, en realidad se ejecutarán en el orden que especificamos en nuestra lista de prioridades: registro, luego autenticación y luego limitación.
Este es el aspecto que podría tener el proceso:
// Request comes in to /dashboard
// 1. CustomLogger middleware runs
// (Logs the incoming request)
// 2. CustomAuthenticator middleware runs
// If not authenticated:
{
"error": "Unauthenticated",
"code": 401
}
// 3. CustomThrottler middleware runs
// If too many requests:
{
"error": "Too Many Requests",
"code": 429
}
// If all middleware pass:
{
"message": "Welcome to the dashboard"
}
Este enfoque garantiza que:
- Se registren todas las solicitudes, incluso si no superan la autenticación o se limitan.
- La autenticación siempre se realiza antes de la limitación, lo que evita una carga innecesaria en el sistema de limitación debido a solicitudes no autenticadas.
- El orden de ejecución del middleware es coherente en toda la aplicación, independientemente de cómo se definan las rutas.
Fuente: Harris Raftopoulos
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión