我有这样的路由 / 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格式不正确的情况下进行数据库调用。我们可以先运行约束规则吗?
编辑: 当我在路由叶子中使用它时,全局约束似乎出了点问题。
答案 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