Laravel。 show index的政策

时间:2017-08-24 08:41:52

标签: php laravel

我想为拥有' 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

寻求帮助。

2 个答案:

答案 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()方法将始终返回trueforeach有点无用。也许尝试使用这样的Laravel集合:

public function view(User $user)
{
    $isUserAdmin = user->roles->search(function($role) {
        return $role->name === 'admin';
    });

    return ($isUserAdmin !== false) ? true : false;
}

答案 1 :(得分:-1)

您是否在AuthServiceProvider注册了该政策?