required_if 带有数组验证规则的验证规则不起作用 |拉拉维尔 |验证

Posted

技术标签:

【中文标题】required_if 带有数组验证规则的验证规则不起作用 |拉拉维尔 |验证【英文标题】:required_if validation rule with the array validation rule is not working | Laravel | Validation 【发布时间】:2022-01-20 13:31:47 【问题描述】:

我有以下验证规则,我需要确保streaming_platforms 数组包含正确的信息。因此,如果 enable 键为真,则需要 stream_keystream_urlstream_key 应该是一个字符串,stream_url 应该是一个 URL。

$validator = Validator::make($input, [
    'name' => 'required|string|min:3|max:255',
    'type' => 'required|in:private,public',
    'streaming_platforms.*.stream_url' => 'required_if:streaming_platforms.*.enable,true|url',
    'streaming_platforms.*.stream_key' => 'required_if:streaming_platforms.*.enable,true|string',
], [
    'streaming_platforms.*.stream_url.required_if' => 'The stream url field is required when platform is enable.',
    'streaming_platforms.*.stream_key.required_if' => 'The stream key field is required when platform is enable.',
]);

if ($validator->fails()) 
    return $this->failResponse([
        "message" => $validator->errors()->first(),
        "messages" => $validator->errors(),
    ], 422);

一切正常,但即使 enable 值为 false,stream_url 和 stream_key 的 URL 和字符串验证规则也会触发。那么,如果没有应用required_if,为什么不停止检查下一个规则呢?

所以我尝试了以下数据。


    "name":"testing",
    "type":"public",
    "streaming_platforms":[
        "id":16,"platform":"youtube","enable":true,"stream_url":"https://www.google.com","stream_key":"abdefghijk",
        "id":17,"platform":"facebook","enable":false,"stream_url":null,"stream_key":null,
        "id":18,"platform":"custom","enable":false,"stream_url":null,"stream_key":null
    ]

所以它返回

streaming_platforms.1.stream_url 格式无效。为了 Facebook 行。

我在某处读到您可以执行以下操作,即使用sometimes 规则。但我不知道如何处理数组类型的数据。

$validator = Validator::make($request->all(), [
    'name' => ['required', 'min:3', 'max:255'],
    'is_public_template' => 'boolean',

    'logo' => ['required_if:is_public_template,true'],
]);
$validator->sometimes('logo', 'required|image|mimes:jpeg,bmp,png,jpg|dimensions:min_width=128,min_height=128', function ($input) 
    return $input->is_public_template;
);

图片形式的真实用例。

【问题讨论】:

您需要添加额外的可空/有时,因为即使其他条件不满足,默认情况下也会以某种方式设置所需的规则。另一个例子是numeric 规则,即使值为空也适用,因此要使其仅在该值存在时起作用,您还需要添加可空规则 nullable 无法正常工作。 我预计问题是您的规则 required_if:streaming_platforms.*.enable,true 表示 * 表示通配符,因此如果 任何 元素具有 enable:true 则将触发该规则。跨度> no miken 它是用于数组元素的。检查此链接。 laravel.com/docs/8.x/validation#validating-nested-array-input 【参考方案1】:

使用exclude_if 规则conditionally exclude 验证字段。

$data = [
    "name" => "testing",
    "type" => "public",
    "streaming_platforms" => [
        ["id" => 16, "platform" => "youtube", "enable" => true, "stream_url" => "https://www.google.com", "stream_key" => "abdefghijk"],
        ["id" => 17, "platform" => "facebook", "enable" => false, "stream_url" => null, "stream_key" => null],
        ["id" => 18, "platform" => "custom", "enable" => false, "stream_url" => null, "stream_key" => null],
     ]
];

$rules = [
    'name' => 'required|string|min:3|max:255',
    'type' => 'required|in:private,public',
    'streaming_platforms.*.stream_url' => 'exclude_if:streaming_platforms.*.enable,false|required|url',
    'streaming_platforms.*.stream_key' => 'exclude_if:streaming_platforms.*.enable,false|required|string',
];

$messages = [
    'streaming_platforms.*.stream_url.required' => 'The stream url field is required when platform is enable.',
    'streaming_platforms.*.stream_key.required' => 'The stream key field is required when platform is enable.',
];

$v = Illuminate\Support\Facades\Validator::make($data, $rules, $messages);

dump($v->fails());

// false

注意,这也会阻止使用Illuminate\Validation\Validator::validated() 方法输出数据:

dump($v->validated());

输出:

   [
     "name" => "testing",
     "type" => "public",
     "streaming_platforms" => [
       [
         "stream_url" => "https://www.google.com",
         "stream_key" => "abdefghijk",
       ],
     ],
   ]

【讨论】:

您能否验证为什么在任何情况下都不会出现此错误消息“启用平台时需要流 url 字段。”? 因此验证错误消息堆栈应该类似于检查启用是否为真然后字段是必需的(如果任何一个为空(stream_url 或 stream_key)),如果我在 URL 中输入内容那么它应该检查格式。 为什么会这样?您只在一项上启用:true,并且设置了 URL。 这是样本数据。请检查我更新的问题。用户可以选中或取消选中流媒体平台,然后他必须输入密钥和 URL 所有流平台都是可选的。如果用户选中其中任何一个,则他必须输入 URL 和密钥以及所需的格式验证。

以上是关于required_if 带有数组验证规则的验证规则不起作用 |拉拉维尔 |验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 验证器规则中不同字段上的多个“required_if”

Laravel 中的 required_if 验证

如果字段是输入类型文件,laravel 中的 required_if 验证不会给出错误

使用带有附加参数的自定义规则验证 Laravel 中的数组

Laravel 翻译值 required_if

Laravel 填充数组元素的验证规则