Почему не срабатвает метод prepareForValidation() в кастомном Request?
Хочу при добавлении определенного материала добавлять user_id к данным,которые проходят валидацию, чтобы в последствии можно было просто добавлять пост такой конструкцией:
Post::create($request->validated());
Создал свой Request:
<?php
namespace App\Http\Requests\Review;
use Illuminate\Foundation\Http\FormRequest;
class StoreReviewRequest extends FormRequest
{
public function prepareForValidation() :void
{
$this->merge([
'ip_address' => $this->ip(),
'status' => ($this->user()->hasRole('admin')) ? 'published' : 'moderation',
'user_id' => $this->user()->id,
]);
}
public function rules()
{
return [
'message' => ['required', 'string'],
'mood' => ['string', 'required'],
'title' => ['string', 'required'],
'post_rating' => ['numeric', 'required'],
'post_id' => ['numeric', 'required'],
'user_id' => ['numeric', 'required'],
'ip_address' => ['required'],
'files' => ['max:3072'],
];
}
}
Но при отправке запроса я на выходе в $request->validated() получаю только те данные, что сам передал. Никак не могу понять. в чем проблема?
Сам контроллер:
public function store(StoreReviewRequest $request)
{
$validatedData = $request->validated();
}
Ответы (2 шт):
Автор решения: Web Desg
→ Ссылка
Замените свой класс StoreReviewRequest на этот
<?php
namespace App\Http\Requests\Review;
use Illuminate\Foundation\Http\FormRequest;
class StoreReviewRequest extends FormRequest {
public function validate()
{
$this->beforeValidate();
parent::validate();
}
private function beforeValidate()
{
$this->merge([
'ip_address' => $this->ip(),
'status' => ($this->user()->hasRole('admin')) ? 'published' : 'moderation',
'user_id' => $this->user()->id,
]);
}
public function rules()
{
return [
'message' => ['required', 'string'],
'mood' => ['string', 'required'],
'title' => ['string', 'required'],
'post_rating' => ['numeric', 'required'],
'post_id' => ['numeric', 'required'],
'user_id' => ['numeric', 'required'],
'ip_address' => ['required'],
'files' => ['max:3072'],
];
}
}
Автор решения: derwin
→ Ссылка
метод ->validated() отдаёт данные после валидатора, который берет правила в методе rules(). Могу предположить, что "не работает" по причине того, что для смерженных данных нет правил валидации.