codeigniter4多维数组validation怎么写?

目前想使用codeigniter4框架对下面的数据进行验证

[{"departmentId":100},{"percentage":10,"departmentId":10}]

验证用的代码如下

$validationService->setRules([
    'costDepartment.*.departmentId' => [
        'rules'=>'required|is_natural_no_zero',
        'errors' => [
            'required' => '必须填写',
            'is_natural_no_zero' => '非0值',
        ]
    ],
    'costDepartment.*.percentage' => [
        'rules'=>'required|is_natural_no_zero|less_than_equal_to[100]',
        'errors'=>[
            'required' => '必须填写',
            'is_natural_no_zero' => '非0值',
            'less_than_equal_to' => '值小于等于{param}',
        ]
    ],
]);

目前对于上述组合来说,运行后是不会得到任何错误的,但我希望是costDepartment的每个元素都对departmentId和percentage进行相应的检查,即按照上述测试用例应该会告诉我有percentage是需要填写的,请问这个需要怎么进行修改,谢谢。

阅读 971
avatarAI BotBETA

在 CodeIgniter 4 中,直接使用点符号(.)来访问多维数组中的元素进行验证可能不总是按预期工作,尤其是当数组结构不固定(如你的示例中,有的元素有 percentage 而有的没有)时。CodeIgniter 4 的验证规则通常是为单维数组或对象属性设计的。

对于你的特定情况,你可以通过自定义验证规则或使用其他方法来处理。但一个简单且直接的方法是,在验证之前,先确保每个 costDepartment 数组元素都包含所有必要的键。

不过,如果你仍然想通过验证器来尝试处理,你可以考虑以下几个步骤:

  1. 预处理数据:确保每个 costDepartment 数组元素都包含 departmentIdpercentage(即使 percentage 的值为 null0)。
  2. 自定义验证规则:虽然 CodeIgniter 4 的内置规则可能不足以直接处理这种情况,但你可以创建自定义规则来检查数组中的每个元素。

然而,更实用的方法可能是使用 PHP 脚本在验证之前处理数据,确保每个元素都符合一定的结构。这里是一个简化的例子,展示如何在验证前预处理数据:

$data = [
    ["departmentId" => 100],
    ["percentage" => 10, "departmentId" => 10]
];

// 预处理数据,确保每个元素都有 departmentId 和 percentage
foreach ($data as &$item) {
    if (!isset($item['departmentId'])) {
        $item['departmentId'] = null; // 或设置为其他默认值
    }
    if (!isset($item['percentage'])) {
        $item['percentage'] = null; // 或设置为其他默认值,如 0
    }
}

// 现在你可以尝试使用你的验证规则,但请注意,你可能需要调整规则来处理可能的 null 值
$validationService->setRules([
    // ... 你的验证规则 ...
]);

// 验证数据
$validationService->withRequest(service('request'))->run($data);

// 检查是否有错误
if (!$validationService->isValid()) {
    // 处理错误
}

请注意,这个示例没有直接解决你的验证问题,因为它依赖于在验证之前通过预处理来确保数据结构的一致性。如果你需要更复杂的验证逻辑(比如基于 departmentId 的条件验证),你可能需要编写自定义验证规则或使用其他逻辑来增强验证过程。

另外,请注意,less_than_equal_to[100] 规则可能不适用于 null 值,因此你需要确保在验证之前处理这些可能的 null 值,或者在你的自定义验证规则中考虑它们。

1 个回答

看了一下源码,无解,只能自己写外挂解决。

推荐问题
宣传栏