流明中间件排序(优先级)
Posted
技术标签:
【中文标题】流明中间件排序(优先级)【英文标题】:Lumen middleware sort (priority) 【发布时间】:2019-05-21 11:49:48 【问题描述】:我正在使用"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
,但我找不到这样做的方法,因为Lumen 先执行$app->middleware
路由。
Laravel 有 $middlewarePriority
这正是我需要的,但我如何在 Lumen 中处理它?
【问题讨论】:
如果不对 Lumen 路由代码进行大量修改,我认为这很难做到。您会看到,Laravel 首先收集和排序所有中间件,Lumen 首先运行全局中间件,然后才检查它是什么路由。 这个问题的任何答案对您有帮助吗? ***.com/questions/31065936/… 【参考方案1】:到目前为止,使用 Lumen v6(可能更早),您可以在定义路由时将中间件指定为数组字段。在路由文件web.php
中,我有如下内容:
$router->get('/api/path/to/thing', [
'uses' => 'FooController@index',
'middleware' => ['etag', 'caching', 'bar']
]);
请注意middleware
字段如何是一个包含三个元素的数组。调用此路由时,中间件etag
将首先执行,然后是caching
,然后是bar
,按此顺序执行。当您只有一个中间件类时,您可以将其指定为纯字符串或仅包含一个元素的数组。这当然可以扩展到route groups,这样你就有了一整类路由都按这个顺序使用这个中间件。
【讨论】:
Lumen 总是可以做到这一点,但是你只能处理命名路由,而不是像我提供的示例中定义的应用于所有路由的路由【参考方案2】:我认为这在 Lumen 中不可能以您想要的方式实现。我的建议是在 router group middleware options 旁边使用中间件。
移除全局中间件注册
/bootstrap/app.php
$app->middleware([
//App\Http\Middleware\AuthTokenAuthenticate::class
]);
将两个中间件添加到路由中间件
/bootstrap/app.php
$app->routeMiddleware([
'auth.token' => Vendor\Utilities\Middleware\AuthToken::class,
'auth.token.authenticate' => App\Http\Middleware\AuthTokenAuthenticate::class
]);
创建两个路由组:一个只包含auth.token.authenticate
,一个包含auth.token
和 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
]);
我认为这是获得预期效果的最干净的方法。
【讨论】:
那么,按照你的例子,对于第二组路由,中间件会按照先auth.token,然后auth.token.authenticate的顺序执行吗? 这不是一个选项,好像我将开始拥有更多需要应用于所有路由的中间件,通过所有路由列表并将其添加到每个路由都不是一个好的解决方案 最初的问题只提到了两个中间件。如果您以后要添加越来越多的中间件,那么我同意这不是一个可行的解决方案。但是,Lumen 对这种情况不提供任何支持。我的建议是寻找或编写自己的包来提供所需的功能。以上是关于流明中间件排序(优先级)的主要内容,如果未能解决你的问题,请参考以下文章