Farid Silva Aboid
Farid Silva Aboid

Reputation: 91

How to combine Laravel validation required_if and required_without_all rules?

I have a situation with a subscription form, which must have different validation rules depending on user selection. I almost complete this, but I'm stuck in a point which need a combination of rules that I think I can't get with predefined laravel rules.

As shown in the following chart, the point is when a user select invoicing preferences, with options Digital and Printed, if user option is Printed I need at least one physical address, so street address field group OR district address fields group must be mandatory.

Flow chart related to conditional validation I need to achieve

Mandatory field unless other field is filled can be achieved by required_without_allrule, so I've trying with no success, a combination of required_if and required_without_allrules, like the following example:

public function rules()
{
return [
...
    'invoicing_preferences' => 'required',
    'invoicing_email' => 'email|required_if:invoicing_preferences,digital',
    'invoicing_street_name' => 'string|required_if:invoicing_preferences,printed|required_without_all:invoicing_district,invoicing_parcel',
    'invoicing_street_number' => 'number|required_if:invoicing_preferences,printed|required_without_all:invoicing_district,invoicing_parcel',
    'invoicing_street_flat' => 'number|required_if:invoicing_preferences,printed|required_without_all:invoicing_district,invoicing_parcel',
    'invoicing_street_dep' => 'alpha_num|required_if:invoicing_preferences,printed|required_without_all:invoicing_district,invoicing_parcel',
    'invoicing_district' => 'alpha_num|required_if:invoicing_preferences,printed|required_without_all:invoicing_street_name, invoicing_street_number; invoicing_street_flat,invoicing_street_dep',
    'invoicing_parcel' => 'alpha_num|required_if:invoicing_preferences,printed|required_without_all:invoicing_street_name, invoicing_street_number; invoicing_street_flat,invoicing_street_dep',

...
    ];
}

This combination doesn't work because always results in the required_with_allrule no matter if I've checked digital at the first point.

Upvotes: 3

Views: 1727

Answers (1)

Kyslik
Kyslik

Reputation: 8385

The rules() method is a method that is expected to return array of rules. Why would I write about such an obvious thing? Well, insert any kind of validation logic inside it, which means that it can also do some evaluation of posted data and gradually build up the returning array.

public function rules()
{
    $this; // holds information about request itself with all the data POST-ed

    if (something) {
        return []; // something is true...
    }

    return []; // default behaviour (ehm, something is not true)
}

Another similar approach is to use multiple arrays and in the end merge them together (build them up). Which may result in nicer code. Also do not be afraid of using one or two private methods to clean up the code.

Upvotes: 1

Related Questions