Клинок Laravel @can policy — строка

Я использую 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, я действительно не знаю, это не работает.

0

Решение

Вы, вероятно, недостаточно внимательно прочитали документы. Вы должны передать в качестве второго аргумента модель, а не строку или объект пользователя. В вашем случае вы, вероятно, должны использовать что-то вроде этого:

@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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]