РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
10 of 1392 menu

Директива 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>

Смотрите также

  • директива @cannot,
    которая проверяет отсутствие прав
  • директива @canany,
    которая проверяет наличие любого из нескольких прав
  • директива @auth,
    которая проверяет авторизацию пользователя
  • директива @guest,
    которая проверяет, что пользователь не авторизован
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить