Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel validation: Required only and only one field

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 system should throw validation error. Is there anything we can do with laravel validation to achieve this?

Thanks.

like image 613
Milan Maharjan Avatar asked Jun 04 '15 05:06

Milan Maharjan


1 Answers

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
like image 191
Anatoliy Arkhipov Avatar answered Nov 14 '22 21:11

Anatoliy Arkhipov