Laravel使用资源控制器方法$id参数作为中间件参数


Laravel use resource controller method $id parameter as middleware parameter

我正在尝试制作一个中间件来检查用户是否具有查看某些页面所需的权限。下面是我目前用来调用中间件的代码。现在,我传递了用户需要拥有的角色的名称,但我还希望传递调用store方法时所需的id。

是否有办法做到这一点,或者我应该在这个控制器中做一个单独的函数,或者将路由检查中间件移动到routes.php?我不喜欢移动它,因为这意味着我必须重新定义资源控制器已经定义的所有路由。

public function __construct()
{
    $this->middleware('permission:Manager',['only' => [
        'show',
    ]]);
}
public function show($id)
{
  //
}

您可以在中间件的handle方法中访问$request对象,以获得所请求页面的id和执行请求的用户,例如:

public function handle($request, Closure $next, $role)
{
    if ( $request->user() && $request->has('id'))
    {
        if ($request->user()->hasRole($request->id, $role)
            return $next($request);
    }        
    return redirect('/403');  // redirect when not allowed
}

请注意hasRole方法和$role参数只是您自己的方法和参数的占位符名称。