Метод authorize
Метод authorize класса FormRequest предназначен для проверки прав доступа пользователя к выполнению запроса. Он вызывается автоматически перед валидацией данных и возвращает логическое значение true или false. Если метод возвращает false, Laravel генерирует исключение с кодом 403 и прерывает выполнение запроса. Внутри метода можно использовать механизмы авторизации Laravel, например, политики или фасад Gate, чтобы проверить, имеет ли пользователь право на выполнение действия.
Синтаксис
Метод не принимает параметров и должен возвращать bool:
<?php
public function authorize(): bool
{
return true; // Разрешить запрос
}
?>
Пример
Давайте разрешим доступ к запросу только для авторизованных пользователей:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ArticleRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user() !== null;
}
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
];
}
}
?>
Пример
Разрешим доступ только тем пользователям, которые являются авторами статьи:
<?php
namespace App\Http\Requests;
use App\Models\Article;
use Illuminate\Foundation\Http\FormRequest;
class UpdateArticleRequest extends FormRequest
{
public function authorize(): bool
{
$article = Article::find($this->route('article'));
if (!$article) {
return false;
}
return $this->user()->id === $article->user_id;
}
public function rules(): array
{
return [
'title' => 'sometimes|string|max:255',
'content' => 'sometimes|string',
];
}
}
?>
Пример
Используем политику для авторизации запроса на удаление:
<?php
namespace App\Http\Requests;
use App\Models\Article;
use App\Policies\ArticlePolicy;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Gate;
class DeleteArticleRequest extends FormRequest
{
public function authorize(): bool
{
$article = Article::find($this->route('article'));
if (!$article) {
return false;
}
return Gate::allows('delete', $article);
}
public function rules(): array
{
return [];
}
}
?>
Пример использования в контроллере
Метод вызывается автоматически при передаче запроса в контроллер:
<?php
namespace App\Http\Controllers;
use App\Http\Requests\ArticleRequest;
use App\Models\Article;
class ArticleController extends Controller
{
public function store(ArticleRequest $request)
{
$validated = $request->validated();
$article = Article::create([
'title' => $validated['title'],
'content' => $validated['content'],
'user_id' => $request->user()->id,
]);
return response()->json($article, 201);
}
}
?>
Смотрите также
-
метод
rules,
который определяет правила валидации -
метод
messages,
который переопределяет сообщения об ошибках -
метод
validated,
который возвращает проверенные данные -
метод
prepareForValidation,
который подготавливает данные перед валидацией