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

时间:2018-12-20 23:36:25

标签: php laravel middleware lumen

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

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

$app->middleware([
    App\Http\Middleware\AuthTokenAuthenticate::class
]);

定义了另一个中间件

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

,并且只会应用于某些特定的路线。

我需要先执行auth.token,然后执行AuthTokenAuthenticate,但我找不到解决方法,因为流明首先执行了$app->middleware路由。

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

2 个答案:

答案 0 :(得分:4)

我认为您不希望在Lumen中做到这一点。我建议在router group middleware options旁边使用中间件。


删除全局中间件注册

/bootstrap/app.php

pageControl.isEnabled = false

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

/bootstrap/app.php

$app->middleware([
    //App\Http\Middleware\AuthTokenAuthenticate::class
]);

创建两个路由组:一个仅包含$app->routeMiddleware([ 'auth.token' => Vendor\Utilities\Middleware\AuthToken::class, 'auth.token.authenticate' => App\Http\Middleware\AuthTokenAuthenticate::class ]); 的路由组,一个同时包含auth.token.authenticate auth.token的路由组。

/ routes / web / php

auth.token.authenticate

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

答案 1 :(得分:0)

截止到Lumen v6(可能更早),您可以在定义路线时将中间件指定为数组字段。在路由文件web.php中,我有以下内容:

$router->get('/api/path/to/thing', [
    'uses' => 'FooController@index',
    'middleware' => ['etag', 'caching', 'bar']
]);

请注意middleware字段是如何包含三个元素的数组。调用此路由时,中间件etag将首先执行,然后依次执行cachingbar。如果只有一个中间件类,则可以将其指定为纯字符串或仅包含一个元素的数组。当然,这可以扩展到route groups,以便您拥有一整类路由,所有路由都按此顺序使用此中间件。