我想为拥有' admin'的用户显示一个表单。角色。我怎么能这样做?现在,我总是假的。
政策
public function view(User $user)
{
foreach ($user->roles as $role) {
$role->name == 'admin';
}
return true;
}
控制器
public function index()
{
$user = Auth::user();
if($user->can('view', $user))
{
$listSections = Section::all();
return view('sections.index', compact('listSections'));
}
else
{
abort(403, 'Only admins can');
}
}
查看
@can('view')
@include('sections.show')
@endcan
寻求帮助。
答案 0 :(得分:2)
您正处于尝试授权不需要任何模型的操作的情况。让我解释一下。
来自Laravel文档:
Laravel应用程序附带的用户模型包括两种有用的授权操作方法:can and cant
这意味着Laravel将传递用户模型的实例作为每个“can”操作方法的第一个参数(在您的情况下为view()
)。因此,当您声明操作方法(在您的情况下为view()
)时,第一个参数应始终为User $user
。你做了什么。
但是当您编写$user->can('view', $user)
时,第一个$user
变量 - 对象运算符左侧的那个变量(箭头) - 引用view()
方法的第一个参数。第二个$user
变量 - can()
方法的第二个参数 - 应该是view()
方法的第二个参数。这是问题所在。你应该:
public function view(User $authenticatedUser, User $user)
{
foreach ($user->roles as $role) {
$role->name == 'admin';
}
return true;
}
但在你的情况下,这完全没用。
实际上,您的view()
方法不需要任何模型。在这种情况下,您只需指定需要用于确定授权操作时使用的策略的类名。你可以这样做:
if ($user->can('view', Section::class)) {
$listSections = Section::all();
return view('sections.index', compact('listSections'));
}
我建议你阅读Laravel文档的这些段落:
顺便说一下:
您的view()
方法将始终返回true
。 foreach
有点无用。也许尝试使用这样的Laravel集合:
public function view(User $user)
{
$isUserAdmin = user->roles->search(function($role) {
return $role->name === 'admin';
});
return ($isUserAdmin !== false) ? true : false;
}
答案 1 :(得分:-1)
您是否在AuthServiceProvider
注册了该政策?