Директива cannot
Директива cannot в Blade-шаблонах Laravel выполняет проверку прав доступа, противоположную директиве can. Она принимает имя действия (ability) и необязательный аргумент - модель, к которой применяется это действие. Если у пользователя нет права на указанное действие, содержимое блока отображается. Директива может быть использована как самостоятельный блок или в паре с секцией else.
Синтаксис
@cannot('action', $model)
<p>У вас нет прав на это действие.</p>
@endcannot
В качестве параметров директива принимает:
- action - строка с названием действия (например, 'update', 'delete');
- $model - экземпляр модели, к которой применяется проверка (необязательный параметр).
Пример
Проверим, есть ли у пользователя право на редактирование статьи. Если права нет, выведем сообщение:
<h1>{{ $article->title }}</h1>
<p>{{ $article->text }}</p>
@cannot('update', $article)
<p>Редактирование этой статьи недоступно.</p>
@endcannot
Результат выполнения кода при отсутствии прав:
<h1>Заголовок статьи</h1>
<p>Текст статьи.</p>
<p>Редактирование этой статьи недоступно.</p>
Пример
Используем директиву cannot вместе с секцией else для отображения разных блоков в зависимости от прав:
@cannot('delete', $article)
<p>Кнопка удаления скрыта.</p>
@else
<button>Удалить статью</button>
@endcannot
Если прав нет - выведется предупреждение, иначе - кнопка удаления.
Пример
Можно использовать директиву cannot без указания модели, передавая только название действия. Тогда проверка будет выполняться глобально, без привязки к конкретной модели:
@cannot('access-admin-panel')
<p>Доступ к панели администратора запрещён.</p>
@endcannot
Если текущий пользователь не авторизован или не имеет права 'access-admin-panel', будет показано соответствующее сообщение.
Пример
Комбинируем директиву cannot с проверкой аутентификации для более гибкого управления доступом:
@auth
@cannot('update', $post)
<p>Вы не являетесь автором этой записи.</p>
@endcannot
@else
<p>Пожалуйста, авторизуйтесь для редактирования.</p>
@endauth