【问题标题】:Laravel validation: Required only and only one fieldLaravel 验证:仅需要且只有一个字段
【发布时间】:2015-08-18 13:59:26
【问题描述】:

我有两个字段,即数字和百分比。我希望用户只在一个输入字段中输入值。如果用户在数字和百分比字段中输入值,系统应该抛出验证错误。我们可以用 laravel 验证做些什么来实现这一点吗?

谢谢。

【问题讨论】:

    标签: php validation laravel


    【解决方案1】:

    您可以为此编写自定义验证器: http://laravel.com/docs/5.0/validation#custom-validation-rules

    它可能看起来像这样:

    class CustomValidator extends Illuminate\Validation\Validator {
    
        public function validateEmpty($attribute, $value)
        {
            return ! $this->validateRequired($attribute, $value);
        }
    
        public function validateEmptyIf($attribute, $value, $parameters)
        {
            $key = $parameters[0];
    
            if ($this->validateRequired($key, $this->getValue($key))) {
                return $this->validateEmpty($attribute, $value);
            }
    
            return true;
        }
    }
    

    在服务提供商处注册:

    Validator::resolver(function($translator, $data, $rules, $messages, $attributes)
    {
        return new CustomValidator($translator, $data, $rules, $messages, $attributes);
    });
    

    使用它(例如在表单请求中):

    class StoreSomethingRequest extends FormRequest {
        // ...
    
        public function rules()
        {
            return [
                'percentage' => 'empty_if:number',
                'number'     => 'empty_if:percentage',
            ];
        }
    }
    

    更新 刚刚在 Tinker 中测试过:

    Validator::make(['foo' => 'foo', 'bar' => 'bar'], ['bar' => 'empty_if:foo'])->fails()
    => true
    Validator::make(['foo' => '', 'bar' => 'bar'], ['bar' => 'empty_if:foo'])->fails()
    => false
    Validator::make(['foo' => '', 'bar' => 'bar'], ['foo' => 'empty_if:bar'])->fails()
    => false
    

    【讨论】:

      【解决方案2】:

      这也是一个很好的解决方案:

      return [
          'video' => [
              'bail',
              function ($attribute, $value, $fail) {
                  if (request()->has($attribute) === request()->filled('videourl')) {
                      return $fail('Only 1 of the two is allowed');
                  }
              },
              'file',
          ],
         'videourl' => [
              'bail',
              function ($attribute, $value, $fail) {
                  if (request()->has($attribute) === request()->filled('video')) {
                      return $fail('Only 1 of the two is allowed');
                  }
              },
          ]
      

      【讨论】:

      • 如果您向我们解释为什么您的代码可以解决 OP 的问题,我相信这会对社区有所帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2016-06-11
      • 2023-03-10
      • 2017-06-07
      相关资源
      最近更新 更多