Функция cannot
Функция cannot является вспомогательной функцией Laravel, предназначенной для проверки отсутствия прав доступа у текущего аутентифицированного пользователя. Она принимает имя способности в качестве первого параметра и необязательные аргументы в качестве второго. Функция возвращает true, если у пользователя нет прав на выполнение указанного действия, и false в противном случае. Она является удобной альтернативой использованию фасада Gate с методом denies.
Синтаксис
<?php
cannot($ability, $arguments = []);
?>
Пример
Давайте проверим, может ли текущий пользователь редактировать статью с id равным 1, и выведем соответствующее сообщение:
@if (cannot('edit', $article))
<p>У вас нет прав на редактирование этой статьи.</p>
@else
<p>Вы можете редактировать эту статью.</p>
@endif
Результат выполнения кода для пользователя без прав:
<p>У вас нет прав на редактирование этой статьи.</p>
Пример
Используем функцию cannot внутри контроллера для условного выполнения логики:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
class ArticleController extends Controller
{
public function show(Article $article)
{
if (cannot('update', $article)) {
return redirect()->route('articles.index')
->with('error', 'Доступ запрещён.');
}
return view('article.edit', ['article' => $article]);
}
}
?>
Пример
Проверим отсутствие права на просмотр списка моделей. Для этого передадим имя класса в качестве второго аргумента:
@if (cannot('viewAny', AppModelsArticle::class))
<div class="alert alert-warning">
Вам недоступен список статей.
</div>
@endif
Результат выполнения кода, если у пользователя нет права viewAny для модели Article:
<div class="alert alert-warning">
Вам недоступен список статей.
</div>
Пример
Функция cannot может быть использована в условиях для управления отображением элементов интерфейса в шаблонах Blade:
<nav>
<ul>
@if (cannot('view-dashboard'))
<li><a href="/">Главная</a></li>
@else
<li><a href="/dashboard">Панель управления</a></li>
@endif
</ul>
</nav>