【问题标题】: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 首先运行全局中间件,然后才检查它是什么路由。
  • 这个问题的任何答案对您有帮助吗? stackoverflow.com/questions/31065936/…

标签: php laravel middleware lumen


【解决方案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 对这种情况不提供任何支持。我的建议是寻找或编写自己的包来提供所需的功能。
猜你喜欢
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2011-10-09
  • 2012-06-07
  • 1970-01-01
相关资源
最近更新 更多