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

ada*_*m78 6 php validation laravel-5 laravel-5.1

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

我想修改一些输入日期字段,如下所示,但它似乎不起作用.

当我设置$this->start_dt的输入字段2016-02-06 12:00:00$this->end_dt2016-02-06 13:00:00我仍然得到验证错误"END_DT必须start_dt后".这意味着更新$this->start_dt$this->end_dtrules()函数内部时,输入请求值不会更改.

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)            
    ];
}
Run Code Online (Sandbox Code Playgroud)

注意: start_dt并且end_dt是日期选择器字段和start_hr,start_min是下拉字段.因此,我需要通过组合所有字段来创建日期时间,以便我可以进行比较.

Tho*_*ini 18

作为laravel 5.4的您可以重写prepareForValidation的方法ValidatesWhenResolvedTrait来修改任何输入.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);
}
Run Code Online (Sandbox Code Playgroud)


Yas*_*lek 5

FormRequest具有方法validateData(),该方法返回数据以进行验证,因此我在表单请求中覆盖了它:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class MyClassRequest extends FormRequest
{
    ...
    /**
     * Get data to be validated from the request.
     *
     * @return array
     */
    public function validationData() {
        return array_merge(
            $this->all(),
            [
                'number' => preg_replace("/[^0-9]/", "", $this->number)
            ]
        );
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Laravel 5.4 :)


use*_*178 1

您可以执行以下操作:

public function rules(Request $request)
{
    if ($request->has('start_dt')){
        $request->replace('start_dt', Carbon::createFromFormat('d M Y H:i:s', $request->start_dt . ' ' . $request->start_hr . ':'. $request->start_min . ':00'));
    }

    if ($request->has('end_dt')){
         $request->replace('end_dt' ,Carbon::createFromFormat('d M Y H:i:s', $request->end_dt . ' ' . $request->end_hr . ':'. $request->end_min . ':00'));
    }

    return [
        'start_dt' => 'required|date|after:yesterday',
        'end_dt' => 'required|date|after:start_dt|before:' . Carbon::parse($request->start_dt)->addDays(30)            
    ];
}
Run Code Online (Sandbox Code Playgroud)