Laravel 5.1 在表单请求验证前修改输入

2021-12-18 00:00:00 validation php laravel-5 laravel-5.1

有没有办法在验证发生之前修改表单请求类中的输入字段?

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_dt2016-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_dtend_dt 是日期选择器字段,start_hrstart_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 开始,您可以覆盖 ValidatesWhenResolvedTraitprepareForValidation 方法来修改任何输入.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);
}

相关文章