Должен ли я использовать prepareForValidation FormRequest для передачи параметров для запроса на проверку?

#laravel

#laravel

Вопрос:

Я хочу передать user_id и post_id в FormRequest. Поэтому я использую prepareForValidation для слияния с запросом, как это сделано в приведенном ниже коде. Это нормально или я должен передавать параметры на контроллере?

 public function rules()
{
    return [
        'content' => 'required',
        'user_id' => 'required|exists:AppModelsUser,id',
        'post_id' => 'required|exists:AppModelsPost,id'
    ];
}

public function prepareForValidation()
{
    $this->merge([
        'user_id' => Auth::user()->id,
        'post_id' => $this->post->id
    ]);
}
  

Комментарии:

1. Пожалуйста, напишите код в блоке кода, а не представляйте его в виде изображения.

2. Я был отредактирован, tks.

3. зачем вам нужно проверять что-либо о текущем аутентифицированном пользователе?

4. Для простых целых чисел я бы просто выбрал стандартные правила проверки, например ['required', 'integer', 'min:1', 'exists:table,id'] ; я бы использовал prepareForValidation() для очистки текстовых вводов, поскольку пользователь мог поместить какой-то вредоносный код в строки.

5. @lagbox Я хочу объединить как user_id, так и post_id с запросом, поэтому в контроллере я просто вызываю $request->validated() как атрибут для создания комментария.

Ответ №1:

Я думаю, что все в порядке, но удалите ненужные проверки, такие как:

существует:AppModels User, id,

и

существует:AppModels Post,id

Я думаю, что все, что вам нужно, чтобы сделать это

 public function rules()
{
    return [
        'content' => 'required',
        'user_id' => 'required',
        'post_id' => 'required'
    ];
}
  

Чтобы избежать попадания в базу данных без причины, пользователь является текущим пользователем, поэтому нет необходимости проверять и отправлять сообщение в текущем запросе, чтобы его нельзя было удалить.

Примечание:

(Бизнес может отличаться для post в зависимости от вашего проекта. Я имею в виду, может ли администратор удалить его, чтобы обычный пользователь не мог выполнить действие, а затем сохранить это правило для post_id (существует: App Models Post,id))

Ответ №2:

Если маршрут выглядит как

 Route::patch('posts/{post}', 'update');
  

 public function rules()
{
    return [
        'content' => 'required'
    ];
}

public function prepareForValidation()
{
    $this->merge([
        'user_id' => auth()->id(),
        'post_id' => $this->route('post')->id
    ]);
}
  

Ответ №3:

Слишком поздно, но вот разумный способ. Перед кодом проверки в контроллере просто используйте следующие 2 метода.

1: $request->request->remove('field_name');

2: $request->request->add(['field_name' => 'modified_value']);

Хорошо идти.