Codeigniter 4中关联数组的键与数组长度验证问题
CodeIgniter 4 中验证JSON数据的解决方案
针对你需要验证的JSON结构,要解决两个核心问题:验证array1的键为数字,以及限制array1最多包含50个键值对,以下是具体实现方案:
核心思路
- 对
array1本身添加规则:确保它是数组,同时检查元素数量上限。 - 通过自定义验证规则(或回调)检查
array1的所有键是否为数字。 - 保留对
array1每个值的数字验证。
实现方式一:使用控制器回调函数
直接在控制器中编写回调函数完成自定义验证:
$validation = \Config\Services::validation(); // 设置完整验证规则 $validation->setRules([ 'field1' => 'required|max_length[20]', 'array1' => 'required|is_array|callback_check_array_keys|callback_check_array_size[50]', 'array1.*' => 'required|numeric' ]); if (! $validation->withRequest($this->request)->run()) { return $this->failValidationErrors($validation->getErrors()); } // 回调函数:检查数组键是否为数字 public function check_array_keys($array) { foreach (array_keys($array) as $key) { // ctype_digit确保键是正整数,若允许浮点数可改用is_numeric if (!ctype_digit($key)) { $this->validation->setError('array1', 'array1的键必须为数字'); return false; } } return true; } // 回调函数:检查数组元素数量上限 public function check_array_size($array, $maxSize) { if (count($array) > $maxSize) { $this->validation->setError('array1', "array1最多只能包含{$maxSize}个键值对"); return false; } return true; }
实现方式二:全局自定义验证规则(推荐复用)
将自定义规则注册到全局,方便多个控制器复用:
1. 注册自定义规则
修改app/Config/Validation.php,添加自定义规则:
public $ruleSets = [ \CodeIgniter\Validation\Rules::class, \CodeIgniter\Validation\FormatRules::class, \CodeIgniter\Validation\FileRules::class, \CodeIgniter\Validation\CreditCardRules::class, ]; public $customRules = [ // 验证数组所有键为数字 'array_keys_numeric' => function ($array) { foreach (array_keys($array) as $key) { if (!ctype_digit($key)) { return false; } } return true; }, // 验证数组元素数量不超过最大值 'array_max_size' => function ($array, $max) { return count($array) <= (int)$max; } ];
2. 添加错误提示(可选)
修改app/Language/zh-CN/Validation.php,添加对应的错误文案:
return [ // ... 保留原有错误信息 'array_keys_numeric' => '{field}的键必须为数字', 'array_max_size' => '{field}最多只能包含{param}个键值对', ];
3. 使用自定义规则
在控制器中直接调用全局规则:
$validation = \Config\Services::validation(); $validation->setRules([ 'field1' => 'required|max_length[20]', 'array1' => 'required|is_array|array_keys_numeric|array_max_size[50]', 'array1.*' => 'required|numeric' ]); if (! $validation->withRequest($this->request)->run()) { return $this->failValidationErrors($validation->getErrors()); }
关键说明
- CI4默认的
array1.*规则仅针对数组值验证,无法处理键的验证,因此必须通过自定义规则实现。 - 使用
ctype_digit而非is_numeric可以确保键是纯数字字符串(如"2876"),若允许类似"12.3"的浮点数字符串,可替换为is_numeric。
内容的提问来源于stack exchange,提问作者ChrisG
相关产品推荐
相关产品推荐

