中间件中的$ request-> route()为空,如何通过路由参数进行过滤?

Ben*_*aar 11 laravel

Laravel 5.1弃用Route::filter()和其他相关功能,在文档中声称:

路由过滤器已被弃用,而不是中间件.

但是如果您的路由过滤器访问路由参数,那么如何用中间件替换它,因为它$request->route()null在中间件中?

Route::filter('foo', function($route, $request) {
    if ($route->parameter('bar') > 1000) {
         return Redirect::route('large-bars');
    }
});
Run Code Online (Sandbox Code Playgroud)

我能看到的最接近的是

class FooMiddleware {
    public function handle($request, Closure $next)
    {
        // Note that $request->route() is null here, as the request
        // hasn't been handled by Laravel yet.

        if ($request->segment(4) > 1000) { // ewww...
            return Redirect::route('large-bars');
        }

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

但这显然比按名称引用参数要脆弱得多.我在这里错过了什么?谢谢!

Ben*_*aar 21

$request->route()对于注册的全局中间件仅为null App\Http\Kernel::$middleware.要访问当前路由,您必须在Kernel::$routeMiddleware以下位置注册中间件:

protected $routeMiddleware = [
    ...,
    'foo' => FooMiddleware::class,
];
Run Code Online (Sandbox Code Playgroud)

由于架构问题,Laravel维护者拒绝了改变这种行为的建议.

  • @Ben 谢谢你,你节省了我 3 个小时的调试时间。 (2认同)