Метод authorize
Метод authorize класса Gate предназначен для проверки авторизации пользователя на выполнение определённого действия. В отличие от методов allows и denies, которые возвращают булево значение, метод authorize выбрасывает исключение AuthorizationException, если пользователь не имеет необходимых прав. Первым параметром передаётся имя действия (ability), вторым - модель или экземпляр, над которым выполняется действие, третьим - дополнительные аргументы.
Синтаксис
<?php
use Illuminate\Support\Facades\Gate;
Gate::authorize($ability, $arguments = []);
?>
Пример
Проверим, может ли текущий пользователь обновить статью:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Support\Facades\Gate;
class ArticleController extends Controller
{
public function update($id)
{
$article = Article::findOrFail($id);
Gate::authorize('update', $article);
// Code for updating the article
return "Article updated successfully";
}
}
?>
Если у пользователя нет прав на обновление, будет выброшено исключение:
"This action is unauthorized."
Пример
Проверим право на удаление статьи с дополнительными условиями:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Support\Facades\Gate;
class ArticleController extends Controller
{
public function destroy($id)
{
$article = Article::findOrFail($id);
Gate::authorize('delete', [$article, 'force']);
$article->delete();
return "Article deleted successfully";
}
}
?>
Результат при успешной авторизации:
"Article deleted successfully"
Пример
Использование метода в контроллере с автоматической обработкой исключения:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Support\Facades\Gate;
use Illuminate\Auth\Access\AuthorizationException;
class PostController extends Controller
{
public function edit($id)
{
$post = Post::findOrFail($id);
try {
Gate::authorize('update', $post);
return view('posts.edit', ['post' => $post]);
} catch (AuthorizationException $e) {
return redirect()->route('posts.index')
->with('error', 'You do not have permission to edit this post.');
}
}
}
?>
Результат при отсутствии прав:
"Redirect to posts.index with error message"