Laravel validation: Required only and only one field

前端 未结 1 1330
一生所求
一生所求 2020-12-10 08:11

I have got two fields namely number and percentage. I want a user to input value in only one input field. If a user inputs values in both number and percentage field, the sy

相关标签:
1条回答
  • 2020-12-10 08:32

    You can write a custom validator for that: http://laravel.com/docs/5.0/validation#custom-validation-rules

    It may looks somthing like this:

    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;
        }
    }
    

    Register it in a service provider:

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

    Use it (in a form request, for example):

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

    Update Just tested it in 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
    
    0 讨论(0)
提交回复
热议问题