【问题标题】:How to combine Laravel validation required_if and required_without_all rules?如何结合 Laravel 验证 required_if 和 required_without_all 规则?
【发布时间】:2017-08-16 19:13:25
【问题描述】:

我有一个订阅表单的情况,它必须根据用户选择具有不同的验证规则。 我几乎完成了这个,但我被困在一个需要组合规则的地方,我认为我无法使用预定义的 laravel 规则。

如下图所示,当用户选择发票首选项时,如果用户选项是Printed,则有DigitalPrinted选项strong> 我需要至少一个物理地址,所以街道地址字段组OR 地区地址字段组必须是必填项。

必填字段除非其他字段填写可以通过required_without_allrule来实现,所以我尝试了没有成功,required_ifrequired_without_allrules的组合,如下示例:

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',

...
    ];
}

这种组合不起作用,因为无论我是否在第一点检查了digital总是会导致required_with_all规则。

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    rules() 方法是一种方法,预计会返回规则数组。我为什么要写这么明显的事情?好吧,在其中插入任何类型的验证逻辑,这意味着它还可以对发布的数据进行一些评估并逐步构建返回数组。

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

    另一种类似的方法是使用多个数组,最后将它们合并在一起(构建它们)。这可能会产生更好的代码。也不要害怕使用一两个私有方法来清理代码。

    【讨论】:

    • 谢谢Kyslik,这个项目实际上已经冻结,所以我直到现在才看到你的回复。为了学习,我会尝试你的建议。
    猜你喜欢
    • 2017-10-23
    • 2019-03-21
    • 2017-06-13
    • 2020-05-25
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    相关资源
    最近更新 更多