【问题标题】:How do I add a custom validator in my FormRequest?如何在我的 FormRequest 中添加自定义验证器?
【发布时间】:2021-04-17 18:01:03
【问题描述】:

我有一个未内置在 Laravel 中的规则 (foobar),我想在我的扩展 FormRequest 中使用它。如何为该特定规则创建自定义验证器?

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

我知道Validator::extend 存在,但我不想使用外观。我希望它“内置”到我的FormRequest。我该怎么做,甚至有可能吗?

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    可以通过为您的类创建validator 属性并将其设置为app('validator') 来获得您的自定义验证方法。然后,您可以使用该属性运行 extend,就像使用外观一样。

    创建一个__construct 方法并添加:

    public function __construct() {
        $this->validator = app('validator');
    
        $this->validateFoobar($this->validator);
    }
    

    然后创建一个名为 validateFoobar 的新方法,它将 validator 属性作为第一个参数并在其上运行 extend,就像使用外观一样。

    public function validateFoobar($validator) {
        $validator->extend('foobar', function($attribute, $value, $parameters) {
            return ! MyModel::where('foobar', $value)->exists();
        });
    }
    

    有关extend 的更多详细信息,请访问here

    最后,您的FormRequest 可能如下所示:

    <?php namespace App\Http\Requests;
    
    use App\Models\MyModel;
    use App\Illuminate\Foundation\Http\FormRequest;
    
    class MyFormRequest extends FormRequest {
        public function __construct() {
            $this->validator = app('validator');
    
            $this->validateFoobar($this->validator);
        }
    
        public function rules() {
            return [
                'id' => ['required', 'foobar']
            ];
        }
    
        public function messages() {
            return [
                'id.required' => 'You have to have an ID.',
                'id.foobar' => 'You have to set the foobar value.'
            ];
        }
    
        public function authorize() { return true; }
    
        public function validateFoobar($validator) {
            $validator->extend('foobar', function($attribute, $value, $parameters) {
                return ! MyModel::where('category_id', $value)->exists();
            });
        }
    }
    

    【讨论】:

    • 您将如何做到这一点并为新的验证过滤器制作自定义错误消息?
    • @JimRubenstein:您可以将自定义消息放入/resources/lang/de/validation.php,如下所示:&lt;?php return [ 'custom' =&gt; [ 'id' =&gt; [ 'foobar' =&gt; 'Custom Message', ], ], ];
    • @JimRubenstein,您可以在 FormRequest 中使用 messages 方法。有关示例,请参阅我的更新答案。
    • @Marwelln 经过一番研究,Validator::extend 还有一个未记录的第三个参数,它接受错误消息。不过,我更喜欢FormRequest::messages 方法! @ roNn23 我知道语言文件——虽然这比我现在需要的更抽象。谢谢!
    【解决方案2】:

    从 5.4 版开始,您可以使用withValidator 方法来扩展规则。

    <?php namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class MyFormRequest extends FormRequest
    {
    
        public function rules() {
            return [
                'id' => ['required', 'foobar']
            ];
        }
    
        public function messages() {
            return [
                'id.required' => 'You have to have an ID.',
                'id.foobar' => 'You have to set the foobar value.'
            ];
        }
    
        public function withValidator($validator)
        {
            $validator->addExtension('foobar', function ($attribute, $value, $parameters, $validator) {
                return ! MyModel::where('category_id', $value)->exists();
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 2014-12-03
      • 1970-01-01
      • 2020-01-07
      • 2019-07-11
      相关资源
      最近更新 更多