Функция can
Функция can применяется для проверки авторизации текущего
пользователя на выполнение определённого действия. Она доступна
в Blade-шаблонах и в коде PHP через фасад Gate или
вспомогательную функцию. Первым параметром передаётся имя
разрешения, вторым - модель или массив моделей, над которыми
проверяется право.
Синтаксис
@can('permission', $model)
Контент доступен
@endcan
Альтернативный синтаксис:
<?php
if (Auth::user()->can('permission', $model)) {
// Действие разрешено
}
?>
Пример в Blade-шаблоне
Проверим, может ли текущий пользователь редактировать статью:
@can('update', $article)
<a href="{{ route('articles.edit', $article) }}">Редактировать</a>
@endcan
Пример в контроллере
Проверим право на создание статьи:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Support\Facades\Auth;
class ArticleController extends Controller
{
public function create()
{
if (Auth::user()->can('create', Article::class)) {
return view('articles.create');
}
return redirect()->route('articles.index')
->with('error', 'No permission');
}
}
?>
Результат выполнения кода при наличии права:
"View returned successfully"
Результат выполнения кода при отсутствии права:
"Redirected to articles.index"
Пример с несколькими моделями
Проверим право на удаление нескольких статей:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Support\Facades\Auth;
class ArticleController extends Controller
{
public function deleteMany()
{
$articles = Article::where('status', 'draft')->get();
if (Auth::user()->can('delete', $articles)) {
// Удаление статей
}
}
}
?>
Пример с фасадом Gate
Используем фасад Gate для проверки права:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Support\Facades\Gate;
class ArticleController extends Controller
{
public function show(Article $article)
{
if (Gate::allows('view', $article)) {
return view('articles.show', ['article' => $article]);
}
return redirect()->route('articles.index');
}
}
?>
Пример с вспомогательной функцией
Используем глобальную функцию can:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
class ArticleController extends Controller
{
public function update(Article $article)
{
if (can('update', $article)) {
// Обновление статьи
}
}
}
?>