CakePHP 3-验证和x27;添加();方法正在使用2个参数,但方法签名表明应该有3个参数
我试图在CakePHP3.5.13中进行验证 因此,我在我的一个表类中添加了以下内容:CakePHP 3-验证和x27;添加();方法正在使用2个参数,但方法签名表明应该有3个参数,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我试图在CakePHP3.5.13中进行验证 因此,我在我的一个表类中添加了以下内容: // src/Model/Table/SavedSearchesTable.php public function validationDefault(Validator $validator) { $validator->add('search_name', [ 'alphanumeric' => [ 'rule' => ['custom'
// src/Model/Table/SavedSearchesTable.php
public function validationDefault(Validator $validator)
{
$validator->add('search_name', [
'alphanumeric' => [
'rule' => ['custom', '/^[a-z0-9 ]*$/i'],
'message' => 'Alphanumeric characters with spaces only'
]
]);
return $validator;
}
这正是我想要的-如果我输入的字符串包含除a-Z、0-9或空格以外的字符,则会收到验证错误消息
但是…阅读文档中的所有->add()
调用都使用3个参数
我查看了源代码(vendor/cakephp/cakephp/src/Validation/Validator.php
),方法如下所示:
public function add($field, $name, $rule = [])
{
// ...
}
如果我为第二个参数传递了一个数组,它将其视为$name
,那么我的规则如何工作
编辑:有人在评论中提到,对于旧代码有一个新的定义。好吧,如果我尝试在模型中使用3个参数(而不是2个)(注意,添加了'custom'
作为第二个参数):
它现在会产生一个错误:
无法调用字段“search\u name”的“default”提供程序中的方法“”
@ndm在评论中对此给出了正确答案 我正在写一个完整的例子,以防其他人有这个问题 它可以写为:
$validator->add(
'search_name',
'alphanumeric',
[
'rule' => ['custom', '/^[a-z0-9 ]*$/i'],
'message' => 'Alphanumeric characters with spaces only'
]
);
或:
$validator->add('search_name',
[ // second argument is an array. This was how it was in the original question.
'alphanumeric' =>
[
'rule' => ['custom', '/^[a-z0-9 ]*$/i'],
'message' => 'Alphanumeric characters with spaces only'
]
]
);
关于add()
方法的工作原理,Cake中给出了以下注释:
将新规则添加到字段的规则集如果第二个参数是数组,则该字段的规则列表将替换为第二个参数,第三个参数将被忽略
在CakePHP 3.5.13中,这两种方法都经过了测试,并给出了相同的结果。我认为您理解错了。正则表达式并没有问题,我的代码完全符合我的要求——但我不明白这是怎么可能的。因为在
->add()
中,我只传递了两个参数(search\u name
和一个数组)。Cake源代码中的add()
函数的签名期望规则是第三个参数。因此,我不知道它是如何应用这些规则的,因为根据该方法的签名,它们将被视为$name
。我明白了,你指的是签名和参数传递。看起来他们做了后备检查。可能是在早期版本的框架中使用了它。是的,但我正在查看我使用的确切版本(3.5.13)的代码。在add()
方法(CakePHP核心代码的一部分)中,它使用定义的参数。因此,我不明白我的代码是如何工作的,因为我作为第二个参数传入的数组将被它们的代码视为$name
(而不是$rule
)。您混淆了这两个语法,第二个参数接受多个规则,并按规则名称进行索引(不要与验证规则方法名称混淆,它是传递给规则
选项的名称!规则名称是唯一标识符,例如稍后在错误数组中使用),使用第三个参数时,需要一个规则,规则名称在第二个参数中,即规则配置中没有其他嵌套。请检查docblock中的示例。
$validator->add('search_name',
[ // second argument is an array. This was how it was in the original question.
'alphanumeric' =>
[
'rule' => ['custom', '/^[a-z0-9 ]*$/i'],
'message' => 'Alphanumeric characters with spaces only'
]
]
);