Laravel: Добавление или изменение данных Request перед валидацией

Источник: «Laravel: Add or Modify Request Data Before Validation»
Иногда требуется добавить данные в Request или изменить их перед валидацией. В Laravel для этого есть несколько трюков — метод merge().

Вариант 1. Объединение данных в Контроллере

Для добавления данных мы можем использовать метод merge(). Этот метод объединяет массив данных с данными Request. Рассмотрим пример.

Контроллер:

public function store(Request $request)
{
$request->merge([
'user_id' => auth()->id(),
]);

$this->validate($request, [
'user_id' => 'required|exists:users,id',
// ...
]);
}

Вариант 2. Form Request: prepareForValidation

Если перед валидацией необходимо модифицировать запрос (например, разделить поле типа user-1 на user и 1), можно воспользоваться методом prepareForValidation, который вызывается перед валидацией.

Класс FormRequest:

public function rules(): array
{
return [
'name' => ['required'],
'email' => ['required', 'email', 'max:254'],
'password' => ['required'],
'role' => ['int', 'required'],
];
}

protected function prepareForValidation()
{
$this->merge([
// Мы разбиваем поле role из `role-1` на `role` и `1`.
'role' => (int)explode('-', $this->role)[1],
// Трансформация имени так, чтобы первая буква каждого слова была заглавной
'name' => ucwords($this->name),
]);
}

После отправки мы можем посмотреть, что даёт нам функция $request->validated():

array:4[ // app/Http/Controllers
"name" => "John Rock",
"email" => "john@example.com",
"password" => "password",
"role" => "12"
]

Этот метод преобразует данные Request в другой формат, поэтому будьте осторожны при непосредственном сохранении данных Request в базу данных с помощью $request->validated().

Дополнительные материалы

Предыдущая Статья

Рефакторинг CSS: Введение

Следующая Статья

Рефакторинг CSS: Стратегия, регрессионное тестирование и сопровождение (часть 2)