Php 在laravel中间件中,缺少参数请求id

Php 在laravel中间件中,缺少参数请求id,php,laravel,middleware,laravel-5.8,Php,Laravel,Middleware,Laravel 5.8,我有一个带有销毁方法的Laravel控制器和一个名为CheckRole的中间件 public function destroy(Request $request, $id) { // code to delete item } class CheckRole { public function handle($request, Closure $next) { } } 我无法在角色中使用$id public function destroy(Request $reque

我有一个带有销毁方法的Laravel控制器和一个名为CheckRole的中间件

public function destroy(Request $request, $id)
{
    // code to delete item
}
class CheckRole
{
  public function handle($request, Closure $next)
  {

  }
}
我无法在角色中使用$id

public function destroy(Request $request, $id)
{
    // code to delete item
}
class CheckRole
{
  public function handle($request, Closure $next)
  {

  }
}

也不使用中间件。
如何修复此问题?

销毁函数中的
$id
是您要删除的资源的
id
,因此这永远不会是经过身份验证的用户id检查角色的更好选项可能是一个而不是一个中间件

或者使用以下命令获取经过身份验证的用户id:
auth()->id()
$request->user()->id

您还可以在
用户
模型中添加一个方法,并进行如下检查:

class User ...

public function isAdmin()
{
    return $this->role === 'admin';
}
Route::resource('user', 'UsersController');
在中间件中

$request->user()->isAdmin();
---编辑

因此,如果在定义路线时使用
资源
,例如:

class User ...

public function isAdmin()
{
    return $this->role === 'admin';
}
Route::resource('user', 'UsersController');
然后在中间件中,您可以访问用户的
id
,如下所示:

$request->user
Route::delete('/users/{user}', 'UsersController@destroy');
如果您的路线是这样的:

$request->user
Route::delete('/users/{user}', 'UsersController@destroy');

然后再次使用命名参数
$request->user
获取它。确保在
{}
路径中使用的任何东西都是用于获取
id
的参数名称。

没有真正安全的方法,因为用户只需在提交的表单中更改id,除非您只想让可以登录的用户成为管理员。如果这是真的,我会使用@nakov的建议

如果您想拥有一个包含角色等的完整权限系统,我建议:


在这里可以找到一个很好的教程,但请不要更改它使用密码所述的任何内容:

在中间件中获取URL参数

class CheckRole
{
  public function handle($request, Closure $next)
  {
    $id = $request->route()->parameter('id');
  }
}

你想达到什么目标?为什么中间件中需要$id?有什么原因不能将$id放入$request中吗?我需要$id来根据角色验证用户,并查找非删除类别中的项目。您可以使用
$request->user()
在中间件中获取用户。您的意思是我们无法在中间件中使用资源url参数吗?o,我不是这个意思。您可以访问中间件中的参数。检查我的编辑你救了我一个晚上!谢谢