Laravel 5.1在表单请求验证之前修改输入 [英] Laravel 5.1 Modify input before form request validation
问题描述
在验证之前,是否可以修改表单请求类中的输入字段?
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
时,输入请求值不会更改.
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);
}
这篇关于Laravel 5.1在表单请求验证之前修改输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!