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

Laravel use resource controller method $id parameter as middleware parameter

我正在尝试制作一个中间件来检查用户是否具有查看某些页面所需的权限。在我当前用来调用中间件的代码下方。我现在传递用户需要拥有的角色的名称,但我还想传递调用存储方法时使用的必需 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 参数只是您自己的方法和参数的占位符名称。