Опубликовано:
Laravel: Добавление или изменение данных Request перед валидацией
Иногда требуется добавить данные в 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()
.