Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP 3-验证和x27;添加();方法正在使用2个参数,但方法签名表明应该有3个参数_Php_Cakephp_Cakephp 3.0 - Fatal编程技术网

CakePHP 3-验证和x27;添加();方法正在使用2个参数,但方法签名表明应该有3个参数

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'

我试图在CakePHP3.5.13中进行验证

因此,我在我的一个表类中添加了以下内容:

// 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'
             ]
    ]
);