【问题标题】:Laravel request validation required_if with multiple conditionsLaravel 请求验证 required_if 有多个条件
【发布时间】:2021-07-22 12:19:12
【问题描述】:

我想使用 Laravel 的 required_if 来实现多个条件的验证。

我有一个对象数组,想验证如果 type=imageisUsed 对象的 属性 是必需的> 的对象是假的。

return request()->validate([
    'sets.*.attribute' => 'required_if:type=image && sets.*.isUsed=false',
]);

如何存档?

【问题讨论】:

    标签: laravel validation


    【解决方案1】:

    你可以使用Rule

    use Illuminate\Validation\Rule;
    
    ...
    
    Rule::requiredIf(function () use ($request) {
            $sets = collect($request->input('sets', []));
    
            return $request->input('type') === 'image'
                   && $sets->filter(fn($set) => $set['isUsed'])->isEmpty();
    }),
    

    假设$sets对应以下值,并且isUsed必须是false在每个集合上。

    $sets = collect([
        ['isUsed' => false],
        ['isUsed' => false],
        ['isUsed' => false],
    ]);
    

    文档中的更多信息:https://laravel.com/docs/8.x/validation#rule-required-if


    请注意,我使用的是 short arrow syntax from PHP7.4 fn() => ...,如果您使用的是较低的 PHP 版本,则必须使用标准匿名函数 function () { ... }

    【讨论】:

    • 但似乎不能应用于对象列表中的项目。
    【解决方案2】:

    我找到了一个可以应用于请求验证的解决方案,它在当前的实现中使用起来更简单。

    return request()->validate([
        'sets.*.attribute' => function ($attr, $value, $fail) {
            if (request()->input('type') == 'image' && !request()->input('sets')[explode('.', $attr)[1]]['isUsed'] && empty($value)) {
                $fail('The ' . $attr . ' is required.');
            }
        },
    ]);
    

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 2020-05-25
      • 2016-10-13
      • 2017-07-08
      • 2021-03-06
      • 2022-12-08
      • 2015-08-07
      • 1970-01-01
      • 2016-07-16
      相关资源
      最近更新 更多