Метод rules
Метод rules класса FormRequest используется для определения правил валидации входящих данных. Он должен возвращать массив, где ключами являются имена полей, а значениями - правила проверки. Правила могут быть представлены в виде строки с разделителем | или в виде массива. Этот метод вызывается автоматически перед передачей запроса в контроллер.
Синтаксис
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class PostRequest extends FormRequest
{
public function rules(): array
{
return [
'field' => 'rule1|rule2|rule3',
'field2' => ['rule1', 'rule2'],
];
}
}
?>
Пример
Давайте создадим запрос для валидации данных статьи. В методе rules укажем, что заголовок обязателен, а содержимое должно быть строкой и иметь минимальную длину:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ArticleRequest extends FormRequest
{
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string|min:50',
'is_published' => 'boolean',
];
}
}
?>
Пример
Теперь используем созданный запрос в контроллере для сохранения статьи. Если валидация не пройдена, Laravel автоматически вернет ответ с ошибками:
<?php
namespace App\Http\Controllers;
use App\Http\Requests\ArticleRequest;
use App\Models\Article;
class ArticleController extends Controller
{
public function store(ArticleRequest $request)
{
$data = $request->validated();
$article = Article::create($data);
return response()->json([
'message' => 'Article created',
'article' => $article,
]);
}
}
?>
Пример
Метод rules может динамически определять правила на основе входных данных или состояния системы. Например, для поля 'slug' установим правило уникальности с игнорированием текущей записи, а поле 'category_id' сделаем обязательным только для новых статей:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use App\Models\Article;
class ArticleRequest extends FormRequest
{
public function rules(): array
{
$rules = [
'title' => 'required|string|max:255',
'content' => 'required|string',
'slug' => [
'required',
'string',
Rule::unique('articles')->ignore($this->route('article')),
],
];
if ($this->isMethod('post')) {
$rules['category_id'] = 'required|exists:categories,id';
}
return $rules;
}
}
?>
Пример
В методе rules можно использовать вложенные правила для валидации массивов. Например, проверим, что у пользователя есть хотя бы один номер телефона и каждый номер имеет правильный формат:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UserRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => 'required|string|max:100',
'email' => 'required|email|unique:users',
'phones' => 'required|array|min:1',
'phones.*' => 'string|regex:/^[0-9]{10}$/',
'profile.age' => 'integer|min:18',
];
}
}
?>
Смотрите также
-
метод
authorize,
который определяет права пользователя на выполнение запроса -
метод
messages,
который переопределяет сообщения об ошибках -
метод
prepareForValidation,
который подготавливает данные перед валидацией -
метод
validated,
который возвращает массив проверенных данных