Php 在laravel中间件中,缺少参数请求id
我有一个带有销毁方法的Laravel控制器和一个名为CheckRole的中间件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
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,我不是这个意思。您可以访问中间件中的参数。检查我的编辑你救了我一个晚上!谢谢