如何在中间件之前运行Laravel路由约束?

时间:2019-02-01 04:09:38

标签: php laravel laravel-5 laravel-5.6

我有这样的路由 / permissions / {uuid} ,而且我有路由约束和中间件。

约束规则:为其应用的所有路由添加路由服务提供商。

Route::pattern('uuid', '[a-f0-9]{8}-?[a-f0-9]{4}-?4[a-f0-9]{3}-?[89ab][a-f0-9]{3}-?[a-f0-9]{12}');

中间件规则:

public function handle($request, Closure $next)
{
    $uuid = $request->route('uuid');

    // Check the uuid in DB and throw an exception

    return $next($request);
}

但是这里的问题是中间件首先运行。我只是想避免在uuid格式不正确的情况下进行数据库调用。我们可以先运行约束规则吗?

编辑: 当我在路由叶子中使用它时,全局约束似乎出了点问题。

1 个答案:

答案 0 :(得分:1)

Laravel收到请求时,将首先通过全局中间件通过管道将其发送,然后尝试查找与该请求匹配的路由。如果找到匹配的路由,它将运行您在路由文件,控制器构造函数等中为其指定的任何中间件,解析该路由的任何方法参数,然后执行该方法。 如果找不到匹配的路由,则几乎只有404。

Route::pattern(...)本质上为该参数添加了一个全局where子句。

因此,在您的情况下,如果您有一个以Route作为参数的{uuid},则只有在URI的uuid部分与提供给{{ 1}}。因此,如果您尝试使用格式不正确的网址,则该网址将与该路由的请求不匹配,并会生成404(除非您有备用广告或其他匹配的路由)。


示例:

Route::pattern
Route::pattern('uuid', '[a-f0-9]{8}-?[a-f0-9]{4}-?4[a-f0-9]{3}-?[89ab][a-f0-9]{3}-?[a-f0-9]{12}');

这将通过:

Route::get('test/{uuid}', 'SomeController@method');

这将导致404:

example.com/test/cfb81fde-9ce6-4a5e-8ddc-38417ef5425c