我想为具有“管理员”角色的用户显示一个表单。我怎样才能做到呢?现在我明白了,总是假的。
政策
public function view(User $user)
{
foreach ($user->roles as $role) {
$role->name == 'admin';
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
控制器
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');
}
}
Run Code Online (Sandbox Code Playgroud)
看法
@can('view')
@include('sections.show')
@endcan
Run Code Online (Sandbox Code Playgroud)
谢谢帮助。
您正处于这样的情况:您正在尝试授权不需要任何模型的操作。让我解释。
来自 Laravel 文档:
Laravel 应用程序中包含的用户模型包含两种有用的授权操作方法:can 和 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;
}
Run Code Online (Sandbox Code Playgroud)
但这对你来说完全没用。
实际上你的view()方法不需要任何模型。在这种情况下,您可以简单地指定需要用于确定授权操作时使用哪个策略的类名称。你可以做:
if ($user->can('view', Section::class)) {
$listSections = Section::all();
return view('sections.index', compact('listSections'));
}
Run Code Online (Sandbox Code Playgroud)
我建议您阅读 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;
}
Run Code Online (Sandbox Code Playgroud)