Laravel blade @can policy - string

时间:2016-04-06 17:16:42

标签: php laravel laravel-5 laravel-5.2 laravel-authorization

我使用的是Laravel 5.2。所以,我正在学习如何处理角色和权限Authorization。一切都运行良好。我甚至制定了自己的政策PostPolicy。

现在问题。我将$ post数据加载到PostsController中的视图中,然后加载到刀片中。

PostsController

@section('content')
<!-- begin -->
@can('hasRole', Auth::user())
    <h1>Displaying Admin content</h1>
@endcan

@can('hasRole', Auth::user())
    <h1>Displaying moderator content</h1>
@endcan

@can('hasRole', Auth::user())
    <h1>Displaying guest content</h1>
@endcan

文章/ show.blade.php

  public function hasRole($user)
    {
        // just for test
        return true;
    }

政策

@can('hasRole', Auth::user())

现在返回所有内容。

当我更改@can('hasRole', 'guest') <h1>Displaying guest content</h1> @endcan 时  从     Auth :: user()到字符串,i.E。

   var convertedToArray = Object.keys(MyKeyword).map(function (key) {return obj[key]});

在这种情况下,它不会返回任何内容。因为我是Laravel的新手,我真的不知道它不起作用。

1 个答案:

答案 0 :(得分:2)

你可能还没有仔细阅读文档。您应该将第二个参数作为模型传递,而不是传递给字符串或用户对象。在你的情况下,你应该使用这样的东西:

@section('content')
<!-- begin -->
@can('hasRole', $post)
    <h1>Displaying Admin content</h1>
@endcan

@can('hasRole', $post)
    <h1>Displaying moderator content</h1>
@endcan

@can('hasRole', $post)
    <h1>Displaying guest content</h1>
@endcan

但问题是你真正希望实现的目标。如果您只想使用用户角色来验证权限,则不需要使用此指令。

您可以添加到User模型函数以验证当前角色,例如

public function hasRole($roleName) 
{
   return $this->role == $roleName; // sample implementation only
}

现在你可以在你的刀片中使用了:

@section('content')
<!-- begin -->

@if (auth()->check())    
    @if (auth()->user()->hasRole('admin'))
        <h1>Displaying Admin content</h1>       
    @elseif (auth()->user()->hasRole('moderator'))
        <h1>Displaying moderator content</h1>
    @endif    
@else
    <h1>Displaying guest content</h1>
@endif