拉拉维尔。展会索引政策

fun*_*fis 6 php laravel

我想为具有“管理员”角色的用户显示一个表单。我怎样才能做到呢?现在我明白了,总是假的。

政策

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)

谢谢帮助。

lou*_*her 7

您正处于这样的情况:您正在尝试授权不需要任何模型的操作。让我解释。

来自 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)