【问题标题】:How to Run Laravel Route Constrains Before Middleware?如何在中间件之前运行 Laravel 路由约束?
【发布时间】:2019-02-01 17:02:52
【问题描述】:

我有类似这样的路由 /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 格式不正确,我只想避免 db 调用。我们可以先运行约束规则吗?

编辑: 当我在 route leavel 中使用它时,全局约束似乎有问题。

【问题讨论】:

  • 中间件在请求进入相应的控制器方法之前运行。因此,这总是在真正的应用程序之外。除非所有中间件都在传递请求,否则不会执行任何控制器方法。您可以在中间件中验证 $uuid

标签: php laravel laravel-5 laravel-5.6


【解决方案1】:

当 Laravel 接收到一个请求时,它最初会通过全局中间件将其通过管道传输,然后尝试找到与请求匹配的路由。如果它确实找到了匹配的路由,它将运行您在路由文件、控制器构造函数等中为其指定的任何中间件,解析路由的任何方法参数,然后执行该方法。 如果它没有找到匹配的路由,它将几乎只是 404。

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

因此,在您的情况下,如果您有一个以{uuid} 为参数的Route,则只有当URI 的uuid 部分与提供给Route::pattern 的模式匹配时,它才会匹配。因此,如果您尝试使用格式不正确的内容访问 url,它将与该路由的请求不匹配,并将导致 404(除非您有一个后备或其他匹配的路由)。


例子:

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');

这会通过:

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

这会导致 404:

example.com/test/1

【讨论】:

  • @vijaykumar 这回答了你的问题还是你还需要帮助?
猜你喜欢
  • 2021-07-03
  • 2016-03-11
  • 2019-01-13
  • 1970-01-01
  • 2019-11-28
  • 2015-09-28
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多