Laravel 表单请求验证后添加自定义变量

问题描述 投票:0回答:6

这是我的表单请求代码,我想在验证成功后添加新变量,这样我就可以在我的控制器上访问该变量:

class CouponRequest extends Request
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'start_year' => 'required',
            'start_month' => 'required',
            'start_day' => 'required',
            'start_time' => 'required',
            'finish_year' => 'required',
            'finish_month' => 'required',
            'finish_day' => 'required',
            'finish_time' => 'required',
        ];
    }

    public function afterValidation()
    {
        $this->start_date = Carbon::create( $this->start_year, $this->start_month, $this->start_day );
    }
}

所以在验证没有错误之后,我可以在我的控制器上调用这个实例:

$request->start_date;

我可以这样做吗?

php laravel validation
6个回答
10
投票

以上所有方法都有效,但在我看来,我会重写表单请求类中的

passedValidation
方法。通过验证检查后调用此方法,从而保持数据干净。

例如。

public function passedValidation()
{
    $this->merge([
       'start_date' => Carbon::create( $this->start_year, $this->start_month, $this->start_day )
    ]);
}

如果您现在转储数据,您还应该看到新的 start_date 值。


4
投票

你可以这样做

public function afterValidation()
{
    $this->request->add([
        'start_date' => Carbon::create($this->start_year, $this->start_month, $this->start_day)
    ]);
}

public function validate()
{
    parent::validate();

    $this->afterValidation();
}

然后访问控制器中的属性

$request->get('start_date');

2
投票

在您的表单请求中使用功能

prepareForValidation()

protected function prepareForValidation(): void
{
    $this->merge([
        'start_date' => Carbon::now()
    ]);
}

干杯!


1
投票

我在控制器中进行了验证。该方法有一个“Request $request”参数。我有一个我这样做:

$input = $request->all();
$input['my_new_field] = 'the_data';

1
投票

我在成功请求操作后使用此方法。

来源:50116187/1101038

public function withValidator(Validator $validator)
{
    if ( $validator->fails() ) {

        \Log::info('Error! No Manipulation!');

    }else{

        $this->merge([
            'custom' => 'Test Manipulation!'
        ]);

        \Log::info('Success Manipulation!');
    }

}

1
投票

在 laravel 8 及以上版本中,你可以这样做:

选项1:

public function safe(array $keys = null): \Illuminate\Support\ValidatedInput|array
{
   $validated_input =  parent::safe($keys);

   return $validated_input->merge([
       'foo' => "bar",
   ]);
 }

然后在控制器中,您可以通过以下方式访问

foo

$request->safe()->foo;

选项2:

public function validated($key = null, $default = null)
{
    $validated = parent::validated($key = null, $default = null);

    return array_merge($validated, [
        'foo' => 'bar'
    ]);
}

然后在控制器中:

$request->validated()['foo'];
© www.soinside.com 2019 - 2024. All rights reserved.