Я использую Laravel 5.2. Итак, я учусь тому, как иметь дело с ролями и разрешениями авторизация. Все отлично работает. Я даже сделал свою собственную политику PostPolicy.
А теперь к проблеме. Я загружаю данные $ post в представление PostsController, которое затем загружается в blade-сервер.
PostsController:
public function show($id)
{
$post = Post::find($id);
return view('posts.show', compact('post'));
}
сообщений / show.blade.php:
@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
политика:
public function hasRole($user)
{
// just for test
return true;
}
Теперь это возвращает весь контент.
Когда я меняю @can('hasRole', Auth::user())
от
Auth :: user () в строку, т.е.
@can('hasRole', 'guest')
<h1>Displaying guest content</h1>
@endcan
В этом случае ничего не возвращается. Поскольку я новичок в Laravel, я действительно не знаю, это не работает.
Вы, вероятно, недостаточно внимательно прочитали документы. Вы должны передать в качестве второго аргумента модель, а не строку или объект пользователя. В вашем случае вы, вероятно, должны использовать что-то вроде этого:
@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
Других решений пока нет …