Директива can
Директива can в Blade позволяет проверить, имеет ли текущий авторизованный пользователь право на выполнение определённого действия. Она работает в паре с системой авторизации Laravel и принимает имя разрешения (ability) в качестве первого параметра. Вторым параметром можно передать модель, к которой применяется проверка. Если пользователь имеет право, содержимое блока отображается, в противном случае - скрывается.
Синтаксис
@can('view', $post)
<p>You can view this post.</p>
@endcan
Также можно использовать блок @else для альтернативного вывода:
@can('update', $post)
<p>You can update this post.</p>
@else
<p>You cannot update this post.</p>
@endcan
Пример
Рассмотрим базовый пример проверки права на просмотр статьи. В контроллере передаём модель 'post' в представление:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function show(Post $post)
{
return view('posts.show', ['post' => $post]);
}
}
?>
В шаблоне используем директиву can для проверки:
<h1>{{ $post->title }}</h1>
@can('view', $post)
<p>{{ $post->content }}</p>
@endcan
Результат выполнения кода для авторизованного пользователя с правом просмотра:
<h1>Article title</h1>
<p>Article content text.</p>
Пример
Используем блок @else для отображения разных сообщений в зависимости от прав пользователя:
<h1>Edit Post</h1>
@can('update', $post)
<form action="/posts/{{ $post->id }}" method="POST">
@csrf
@method('PUT')
<label>Title</label>
<input type="text" name="title" value="{{ $post->title }}">
<label>Content</label>
<textarea name="content">{{ $post->content }}</textarea>
<button type="submit">Update</button>
</form>
@else
<p>You do not have permission to edit this post.</p>
@endcan
Результат выполнения кода для пользователя без прав редактирования:
<h1>Edit Post</h1>
<p>You do not have permission to edit this post.</p>
Пример
Директива can также может принимать несколько разрешений через массив. В этом случае проверяется наличие хотя бы одного из них:
<h2>Post Management</h2>
@can(['update', 'delete'], $post)
<div class="actions">
<a href="/posts/{{ $post->id }}/edit">Edit</a>
<form action="/posts/{{ $post->id }}" method="POST">
@csrf
@method('DELETE')
<button type="submit">Delete</button>
</form>
</div>
@endcan
@can('view', $post)
<p>{{ $post->description }}</p>
@endcan
Результат выполнения кода для пользователя, имеющего право на удаление:
<h2>Post Management</h2>
<div class="actions">
<a href="/posts/1/edit">Edit</a>
<form action="/posts/1" method="POST">
<input type="hidden" name="_token" value="...">
<input type="hidden" name="_method" value="DELETE">
<button type="submit">Delete</button>
</form>
</div>
<p>Post description text.</p>