如果需要,如何结合Laravel验证?如果需要,如何结合Laravel验证?如果没有所有规则,如何结合Laravel验证?

如果需要,如何结合Laravel验证?如果需要,如何结合Laravel验证?如果没有所有规则,如何结合Laravel验证?,laravel,laravel-5,Laravel,Laravel 5,我有一个订阅表单的情况,它必须根据用户选择具有不同的验证规则。 我几乎完成了这项工作,但我陷入了一个困境,需要一个规则组合,我认为我无法用预定义的laravel规则来实现 如下图所示,这一点是当用户选择发票首选项时,带有选项数字和打印,如果用户选项为打印,我需要至少一个物理地址,因此街道地址字段组或地区地址字段组必须是强制性的 必填字段除非其他字段已填充,否则可以通过required\u而不使用规则来实现,因此我尝试了required\u if和required\u而不使用规则的组合,但没有成

我有一个订阅表单的情况,它必须根据用户选择具有不同的验证规则。 我几乎完成了这项工作,但我陷入了一个困境,需要一个规则组合,我认为我无法用预定义的laravel规则来实现

如下图所示,这一点是当用户选择发票首选项时,带有选项数字打印,如果用户选项为打印,我需要至少一个物理地址,因此街道地址字段组地区地址字段组必须是强制性的

必填字段除非其他字段已填充,否则可以通过
required\u而不使用
规则来实现,因此我尝试了
required\u if
required\u而不使用
规则的组合,但没有成功,如下示例:

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

...
    ];
}
这种组合不起作用,因为无论我是否在第一点选中了数字,总是会产生带有所有规则的
required\u
规则。

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,这个项目实际上已经冻结了,所以我直到现在才看到你的回复。为了学习,我将尝试你的建议。