问题描述
有没有办法在验证发生之前修改表单请求类中的输入字段?
is there a way to modify input fields inside a form request class before the validation takes place?
我想如下修改一些输入日期字段,但它似乎不起作用.
i want to modify some input date fields as follows but it doesn't seem to work.
当我将 $this->start_dt 输入字段设置为 2016-02-06 12:00:00 和 $this->end_dt 到 2016-02-06 13:00:00 我仍然收到验证错误end_dt 必须在 start_dt 之后".这意味着当您更新 rules()<中的 $this->start_dt 和 $this->end_dt 时,输入请求值不会改变/code> 函数.
when i set $this->start_dt input field to 2016-02-06 12:00:00 and $this->end_dt to 2016-02-06 13:00:00 i still get validation error "end_dt must be after start_dt". which means the input request values aren't getting changed when you update $this->start_dt and $this->end_dt inside the rules() function.
public function rules() { if ($this->start_dt){ $this->start_dt = carbon::createfromformat('d m y h:i:s', $this->start_dt . ' ' . $this->start_hr . ':'. $this->start_min . ':00'); } if ($this->end_dt){ $this->end_dt = carbon::createfromformat('d m y h:i:s', $this->end_dt . ' ' . $this->end_hr . ':'. $this->end_min . ':00'); } return [ 'start_dt' => 'required|date|after:yesterday', 'end_dt' => 'required|date|after:start_dt|before:' . carbon::parse($this->start_dt)->adddays(30) ]; }
注意: start_dt 和 end_dt 是日期选择器字段,start_hr、start_min 是下拉字段.因此,我需要通过组合所有字段来创建一个日期时间,以便我可以进行比较.
note: start_dt and end_dt are date picker fields and the start_hr, start_min are drop down fields. hence i need to create a datetime by combining all the fields so that i can compare.
推荐答案
从 laravel 5.4 开始,您可以覆盖 validateswhenresolvedtrait 的 prepareforvalidation 方法来修改任何输入.laravel 5.1 应该可以实现类似的功能.
as of laravel 5.4 you can override the prepareforvalidation method of the validateswhenresolvedtrait to modify any input. something similar should be possible for laravel 5.1.
请求中的示例
/** * modify the input values * * @return void */ protected function prepareforvalidation() { // get the input $input = array_map('trim', $this->all()); // check newsletter if (!isset($input['newsletter'])) { $input['newsletter'] = false; } // replace old input with new input $this->replace($input); }