流明中间件排序(优先级)

Sev*_*kov 5 php middleware laravel lumen

我正在使用 "laravel/lumen-framework": "5.7.*"

我有两个中间件,第一个AuthTokenAuthenticate应该应用于所有路由,因此它的定义bootstrap/app.php

$app->middleware([
    App\Http\Middleware\AuthTokenAuthenticate::class
]);
Run Code Online (Sandbox Code Playgroud)

另一个中间件的定义如下

$app->routeMiddleware([
    'auth.token' => Vendor\Utilities\Middleware\AuthToken::class
]);
Run Code Online (Sandbox Code Playgroud)

并且仅适用于某些特定路线。

我需要auth.token先执行,然后AuthTokenAuthenticate才能找到方法,因为流明先执行$app->middleware路线。

Laravel $middlewarePriority正是我需要的,但是我如何在流明中处理它呢?

小智 5

我认为这在 Lumen 中是不可能的。我建议将中间件与路由器组中间件选项一起使用。


移除全局中间件注册

/bootstrap/app.php

$app->middleware([
    //App\Http\Middleware\AuthTokenAuthenticate::class
]);
Run Code Online (Sandbox Code Playgroud)

将两个中间件添加到路由中间件

/bootstrap/app.php

$app->routeMiddleware([
    'auth.token' => Vendor\Utilities\Middleware\AuthToken::class,
    'auth.token.authenticate' => App\Http\Middleware\AuthTokenAuthenticate::class
]);
Run Code Online (Sandbox Code Playgroud)

创建两个路由组:一个只包含auth.token.authenticate一个,另一个包含auth.token auth.token.authenticate

/路线/网络/ 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
}]);
Run Code Online (Sandbox Code Playgroud)

我认为这是获得所需效果的最干净的方法。