I'm using "laravel/lumen-framework": "5.7.*"
I have two middlewares, first one AuthTokenAuthenticate that should be applied to all the routes, so its defined in bootstrap/app.php like
$app->middleware([
    App\Http\Middleware\AuthTokenAuthenticate::class
]);
Another middleware is defined like
$app->routeMiddleware([
    'auth.token' => Vendor\Utilities\Middleware\AuthToken::class
]);
and will only be applied to some specific routes.
I need auth.token to be executed first, then AuthTokenAuthenticate but I can't find the way to do it because Lumen executes $app->middleware routes first. 
Laravel has $middlewarePriority which is exactly what I need, but how can I handle it in Lumen? 
I don't think this is possible in Lumen in the way you want to. What I suggest is using the middleware alongside the router group middleware options.
Remove the global middleware registration
/bootstrap/app.php
$app->middleware([
    //App\Http\Middleware\AuthTokenAuthenticate::class
]);
Add both middlewares to the route middleware
/bootstrap/app.php
$app->routeMiddleware([
    'auth.token' => Vendor\Utilities\Middleware\AuthToken::class,
    'auth.token.authenticate' => App\Http\Middleware\AuthTokenAuthenticate::class
]);
Create two route groups: one with just auth.token.authenticate and one group with both auth.token and auth.token.authenticate.
/routes/web/php
$router->get('/', ['middleware' => 'auth.token.authenticate', function () use ($router) {
    // these routes will just have auth.token.authenticate applied
}]);
$router->get('/authenticate', ['middleware' => 'auth.token|auth.token.authenticate', function () use ($router) {
    // these routes will have both auth.token and auth.token.authenticate applied, with auth.token being the first one
}]);
I think this is the cleanest way to get the desired effect.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With