Respect Validations动态链式验证及参数分配实现问题
实现Respect Validations动态链式调用的正确方式
你当前的代码在处理带参数的验证规则时的核心问题是硬编码了参数的数量和位置——你只考虑了0个或最多2个参数的情况,但Respect Validations的很多验证器支持可变数量的参数,或者参数本身是数组、对象等复杂类型,这种写法会导致参数传递错误,甚至直接抛出方法调用异常。
举个实际的例子:
- 像
inArray()验证器需要传入一个数组作为单个参数,你的代码会错误地尝试把数组拆成多个参数传递,直接触发报错 - 有些验证器支持可选参数(比如
length()可以只传最小长度,也可以同时传最小+最大长度),你的写法没法适配这种灵活的参数场景
这里给你修正后的实现,用PHP的可变参数语法来动态传递参数,完美适配任意参数数量和类型:
$validator = v::notEmpty(); foreach ($validations as $validation) { $validatorName = (string)$validation['validatorName']; // 确保params存在,默认是空数组避免无参数时报错 $params = $validation['params'] ?? []; // 用可变参数语法把数组元素作为独立参数传递给验证器方法 $validator = $validator->$validatorName(...$params); }
示例说明
假设你的$validations数组是这样的:
$validations = [ // 需要两个参数的between验证 ['validatorName' => 'between', 'params' => [5, 20]], // 无参数的alphaNumeric验证 ['validatorName' => 'alphaNumeric'], // 传入数组作为单个参数的inArray验证 ['validatorName' => 'inArray', 'params' => [['draft', 'published']]] ];
这段代码会自动处理每种情况:
- 调用
$validator->between(5, 20) - 调用
$validator->alphaNumeric() - 调用
$validator->inArray(['draft', 'published'])
这种写法完全兼容Respect Validations所有验证器的参数要求,再也不用为参数数量发愁啦。
内容的提问来源于stack exchange,提问作者Yasiru Nilan
相关产品推荐
相关产品推荐

