【问题标题】:Using complex conditional validation rule in FormRequest in Laravel在 Laravel 的 FormRequest 中使用复杂的条件验证规则
【发布时间】:2023-03-12 02:47:01
【问题描述】:

我正在使用 Laravel 开发一个 Web 应用程序。我现在正在做的是为验证创建一个 FirmRequest。

这是我的表单请求。

use Illuminate\Foundation\Http\FormRequest;

class StoreVacancy extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title' => 'required',
            'type' => 'required',
            'complex_field' => ...need complex conditional validation based on the type field
        ];
    }
}

如果我没有使用 FormRequest,我可以在控制器中创建验证器并设置复杂的条件验证规则。

$v = Validator::make($data, [
    //fields and rules
]);

$v->sometimes('reason', 'required|max:500', function ($input) {
    return $input->games >= 100;
});

但问题是我没有在控制器中创建验证器。但我正在使用 FormRequest。如何在 FormRequest 中实现同样的功能?

【问题讨论】:

标签: laravel laravel-validation laravel-request


【解决方案1】:

从 5.4 开始,您可以在 FormRequest 中使用“withValidator”方法: https://laravel.com/docs/5.4/validation

此方法接收完全构造的验证器,允许您在实际评估验证规则之前调用其任何方法

use Illuminate\Foundation\Http\FormRequest;

class StoreVacancy extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title' => 'required',
            'type' => 'required',
        ];
    }

    public function withValidator($validator)
    {
        $validator->sometimes('reason', 'required|max:500', function ($input) {
            return $input->games >= 100;
        });
    }
}

【讨论】:

  • 这是一个很好的答案,因为允许用户完全访问输入对象,因此可以检查任何参数并添加内置验证或自定义参数,从而提供了很大的灵活性。
【解决方案2】:

您可以检查https://github.com/laravel/framework/blob/5.7/src/Illuminate/Foundation/Http/FormRequest.php 中的createDefaultValidator 函数。我们将覆盖该函数并添加我们的条件

    /**
     * Add Complex Conditional Validation to the validator instance.
     *
     * @param  \Illuminate\Validation\Factory  $factory
     * @return \Illuminate\Validation\Validator
     */
    public function validator($factory)
    {
        $validator = $factory->make(
            $this->validationData(),
            $this->container->call([$this, 'rules']),
            $this->messages(),
            $this->attributes()
        );

        $validator->sometimes('reason', 'required|max:500', function ($input) {
            return $input->games >= 100;
        });

        return $validator;
    }

【讨论】:

    【解决方案3】:

    您可以根据输入数据手动调整规则:

    class StoreVacancy extends FormRequest
    {
        public function rules()
        {
            $reason = $this->request->get('reason'); // Get the input value
            $rules = [
                'title' => 'required',
                'type'  => 'required',
            ];
    
            // Check condition to apply proper rules
            if ($reason >= 100) {
                $rules['complex_field'] = 'required|max:500';
            }
    
            return $rules;
        }
    }
    

    它与sometimes不同,但它的作用相同。

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 2015-05-22
      • 2019-08-01
      • 2020-09-06
      • 2020-01-05
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2020-12-23
      相关资源
      最近更新 更多