php - CakePHP 3 - 创建新的验证器

标签 php validation cakephp cakephp-3.0

再次嗨:)我想创建一个新的验证数据。当我烘焙模型时,它会生成验证

UsersTable.php - 我仅发布部分示例..

 public function validationDefault(Validator $validator)
    {
         $validator
            ->add('id', 'valid', ['rule' => 'numeric'])
            ->allowEmpty('id', 'create');
   return $validator;
}

我会创建另一个..在其中我将验证写入另一个表单..例如编辑

public function validationEditUser(Validator $validator){
...
}

这就是我所说的验证?

<?= $this->Form->create($user,['context' => ['valitador' => 'validationEditUsers']]); ?>

我创建的验证之间是否存在继承过程?

已更新

我将演示当前发生的情况。我正在为表单用户/添加使用此验证

public function validationDefault(Validator $validator)
    {
         $validator            
            ->requirePresence('password', 'create')
            ->notEmpty('password',"Field's empty")
            ->add('password',[
                'minLength' => [
                'rule' => ['minLength', 5],
                'last' => true,
                'message' => 'Password is low, add more characters'
                ]
            ]);
         return $validator;
}

现在,我将这个验证用于我的表单“用户/编辑”

public function validationEditUsers(Validator $validator){
         //Its empty 
}

这就是我告诉表单上下文使用哪个验证器的方式

<?= $this->Form->create($user,['context' => ['valitador' => 'editUsers']]) ?>

发生的事情是消息“密码低..”(属于“ValidationDefault”)在我的表单编辑中触发。我认为使用上下文只会使用 ValidationEditUsers 进行验证。为什么它没有发生?

最佳答案

验证器命名约定

您不会在表单中“调用”验证,您只需告诉表单上下文要使用哪个验证器(用于检查必填字段)。传递的名称应省略方法名称的 validation 部分,并以小写字母开头,因此在您的情况下为 editUser

$this->Form->create($user, [
    'context' => [
        'validator' => 'editUser'
    ]
]);

<强> http://book.cakephp.org/3.0/en/views/helpers/form.html#using-custom-validators

在指定编码请求数据时使用哪个验证器时,适用相同的规则。

$Table->newEntity($this->reqeust->data, [
    'validate' => 'editUser'
]);

<强> http://book.cakephp.org/3.0/en/orm/saving-data.html#validating-data-before-building-entities

继承验证规则

不,不涉及继承,如果需要/想要这个,您必须自己处理这个问题,通过调用必要的验证方法,类似于

public function validationDefault(Validator $validator)
{
    $validator
        ->add(/* ... */);
    
    return $validator;
}

public function validationEditUser(Validator $validator)
{
    $this
        ->validationDefault($validator)
        ->add(/* ... */);
    
    return $validator;
}

这将使 editUser 验证器在应用其他规则之前“继承”默认规则。

更新

正如最初提到的,表单助手不执行任何验证,它使用验证器的全部目的是检查哪些字段是必需的,然后设置适当的 HTML 元素属性。实际验证发生在编码请求数据时,表单助手仅显示实体上存储的错误。

请参阅 newEntity() 示例和上面的链接,了解如何定义用于实际验证的验证器。顺便说一句,您的代码中有一个拼写错误,它必须是 validator,而不是 valitador!

关于php - CakePHP 3 - 创建新的验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443794/

相关文章:

php - 如何在 CakePHP 中将参数从一个 Controller 传递到另一个 Controller ?

php - CakePhp:Cake Email AfterSend 事件

javascript - 将 Angular 验证指令与 Breeze 一起使用会阻止任何无效输入

validation - 是否可以从聚合工厂调用规范进行验证,或者该验证调用是否属于单元测试 (DDD)?

.htaccess - 在 Cakephp 2.0 中使用 .htaccess 进行 URL 重定向

PHP lambda 函数和作用域

excel - 将数组变量传递给 Excel 命名范围以进行数据验证列表

php - 使用 JQuery AJAX 和 php 获取数据到 mysql 数据库

php - 获取cake 3 php中2个日期之间的数据结果

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP