Метод can
Метод can применяется к экземпляру модели пользователя
и позволяет проверить, имеет ли пользователь разрешение
на выполнение указанного действия. Первым параметром
передаётся имя способности, вторым - модель или
массив с параметрами. Метод возвращает логическое
значение true или false.
Синтаксис
<?php
$user->can($ability, $arguments);
?>
Пример
Давайте проверим, может ли текущий пользователь создавать статьи:
<?php
use AppModelsUser;
use AppModelsArticle;
use IlluminateSupportFacadesAuth;
$user = User::find(1);
$res = $user->can('create', Article::class);
var_dump($res);
?>
Результат выполнения кода:
true
Пример
Давайте проверим, может ли пользователь обновлять конкретную статью:
<?php
use AppModelsUser;
use AppModelsArticle;
$user = User::find(1);
$article = Article::find(1);
$res = $user->can('update', $article);
var_dump($res);
?>
Результат выполнения кода:
false
Пример
Давайте проверим право на удаление статьи с использованием массива параметров:
<?php
use AppModelsUser;
use AppModelsArticle;
$user = User::find(1);
$article = Article::find(1);
$res = $user->can('delete', [$article, 'force' => true]);
var_dump($res);
?>
Результат выполнения кода:
false
Пример
Давайте проверим право на просмотр списка статей с помощью метода в контроллере:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateSupportFacadesAuth;
class ArticleController extends Controller
{
public function index()
{
if (Auth::user()->can('viewAny', Article::class)) {
$articles = Article::all();
return view('articles.index', ['articles' => $articles]);
}
abort(403, 'You do not have permission to view articles.');
}
}
?>
Результат выполнения кода при успешной проверке:
"Return view with articles collection"
Пример
Давайте используем метод can непосредственно
в Blade-шаблоне для отображения кнопки редактирования:
<h1>{{ $article->title }}</h1>
<p>{{ $article->content }}</p>
@if(Auth::user()->can('update', $article))
<a href="{{ route('articles.edit', $article) }}">Edit</a>
@endif
Результат выполнения кода для пользователя с правом редактирования:
<h1>Article Title</h1>
<p>Article content goes here</p>
<a href="/articles/1/edit">Edit</a>
Результат выполнения кода для пользователя без права редактирования:
<h1>Article Title</h1>
<p>Article content goes here</p>