cakephp - 如何在 cakephp3 中为无模型表单创建自定义验证

标签 cakephp cakephp-3.2

我想为我的字段创建自定义验证。 Form 是从 cakephp Form 类(无模型表单)扩展而来的。

注意:请记住,这是无模型表单,因此没有表或数据库。

问题是当我创建验证时它给了我这个错误。

Method isValidCardNumber does not exist

这是我的代码:

<?php
namespace App\Form;

use Cake\Core\Configure;
use Cake\Form\Form;
use Cake\Form\Schema;
use Cake\Network\Exception\SocketException;
use Cake\Validation\Validator;
use SagePay\SagePayDirectPayment;

/**
 * Payment Form
 */
class PaymentForm extends Form
{

    /**
     * Define the schema
     *
     * @param  \Cake\Form\Schema $schema The schema to customize.
     * @return \Cake\Form\Schema The schema to use.
     */
    protected function _buildSchema(Schema $schema)
    {
        return $schema
            ->addField('name', 'string')
            ->addField('card_number', 'string')
            ...
            ...;
    }

    /**
     * Define the validator
     * 
     * @param  \Cake\Validation\Validator $validator The validator to customize.
     * @return \Cake\Validation\Validator The validator to use.
     */
    protected function _buildValidator(Validator $validator)
    {
        return $validator   
            ->notEmpty('name', 'Please enter the name on card.')    
            ->notEmpty('card_number', 'string')
            ->add('card_number', 'isValidCardNumber', [
                'rule' =>  ['isValidCardNumber'],
                'message' => 'Card number should be 16 long number.'
            ])
            ...
            ...;

    }

    protected function isValidCardNumber($data, array $context)
    {
        debug($data);
        die;
    }
}

最佳答案

您需要将其设置为提供商。

Add your object as provider.

$validator = new Validator();

// Use an object instance.
$validator->provider('custom', $myObject);

// Use a class name. Methods must be static.
$validator->provider('custom', 'App\Model\Validation');

Then use it.

use Cake\ORM\Table;
use Cake\Validation\Validator;

class UsersTable extends Table
{

    public function validationDefault(Validator $validator)
    {
        $validator
            ->add('role', 'validRole', [
                'rule' => 'isValidRole', // <--- method
                'message' => __('You need to provide a valid role'),
                'provider' => 'table', // <--- provider
            ]);
        return $validator;
    }

    public function isValidRole($value, array $context)
    {
        return in_array($value, ['admin', 'editor', 'author'], true);
    }

}

代码是从官方文档复制粘贴的,请根据您的用例需要进行更改。

关于cakephp - 如何在 cakephp3 中为无模型表单创建自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38825727/

相关文章:

cakephp - "Can not buid tree with empty xml"在 cakephp 2.3.8 中使用 html2ps 时出错

php - cakephp 中的记录级别访问

php - CakePHP Bake Shell 错误 : Database connection “Mysql” is missing, 或无法创建

cakephp - 在CakePHP的WHERE IN中使用数组

authentication - CakePHP 错误 : Class App\Controller\AuthComponent not found

CakePHP CSS 未在 ubuntu 14.04 上加载

cakephp - CakePHP删除表中的所有记录

cakephp - empty() 在 cakephp 中不起作用

cakephp - cakePHP 3.4 中的登录重定向

cakephp - 如何在子目录中安装 CakePHP 3