douying6206 2016-03-27 10:55
浏览 54

Cake 3.x验证 - 创建可重用的验证器

I am working on cakephp 3.x and i am trying to validate user change password form. So here i tried to create a separate class for validation see the code below

UserValidator In constructor i defined some validation rules.

<?php
namespace App\Model\Validation;

use Cake\Validation\Validator;

class UsersValidator extends Validator
{
    public function __construct()
    {
        parent::__construct();
        // Add validation rules here.
        $this
            ->requirePresence('old_password')
            ->notEmpty('old_password');

        $this
            ->requirePresence('password')
            ->notEmpty('password');

        $this
            ->requirePresence('confirm_password')
            ->notEmpty('confirm_password');
    }

    public function validateChangePasswordForm(){

    }

}

UserModel Where i am trying to use it ...

<?php
namespace Accounts\Model\Table;
use Accounts\Model\Entity\User;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validation;
use Cake\Validation\Validator;
use App\Model\Validation\UsersValidator;
/**
 * Users Model
 *
 * @property \Cake\ORM\Association\BelongsTo $Roles
 */
class UsersTable extends Table
{
    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config)
    {
        parent::initialize($config);
        $this->table('users');
        $this->displayField('first_name');
        $this->primaryKey('id');
        $this->addBehavior('Timestamp');
        $this->belongsTo('Roles', [
            'foreignKey' => 'role_id',
            'joinType' => 'LEFT',
            'className' => 'Accounts.Roles',
        ]);
        $this->hasOne('Profiles', [
            'foreignKey' => 'user_id',
            'className' => 'Accounts.Profiles',
            'dependent' => true
        ]);
    }
    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationChangepass(UsersValidator $validator)
    {
        return $validator;
    }
    public function validationDefault(Validator $validator)
    {
        $validator
            ->integer('id')
            ->allowEmpty('id', 'create');

        return $validator;
    }
    /**
     * Returns a rules checker object that will be used for validating
     * application integrity.
     *
     * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
     * @return \Cake\ORM\RulesChecker
     */
    public function buildRules(RulesChecker $rules)
    {
        $rules->add($rules->isUnique(['email']));
        $rules->add($rules->isUnique(['username']));
        $rules->add($rules->existsIn(['role_id'], 'Roles'));
        return $rules;
    }
    public function beforeSave($event, $entity, $options){
        if($entity->first_name)
            $entity->slug = $this->createSlug($entity->first_name);
    }
}

User Change Password Form

<div class="users form large-9 medium-8 columns content">

    <?php echo $this->Form->create($user, ['context' => ['validator' => 'Changepass']]); ?>
    <fieldset>
        <legend><?= __('ChangePassword') ?></legend>
        <?php echo $this->Form->input('old_password', ['autocomplete'=>'off' ]) ?>
        <?php echo $this->Form->input('password', ['label'=>'New Password', 'autocomplete'=>false]) ?>
        <?php echo $this->Form->input('confirm_password', ['label'=>'Re-Enter Password']) ?>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>
</div>

Errors

Warning (4096): Argument 1 passed to Accounts\Model\Table\UsersTable::validationChangepass() must be an instance of App\Model\Validation\UsersValidator, instance of Cake\Validation\Validator given, called in C:\wamp\www\comsats-lounge\vendor\cakephp\cakephp\src\Validation\ValidatorAwareTrait.php on line 106 and defined [ROOT\plugins\Accounts\src\Model\Table\UsersTable.php, line 55]

I have try to overcome on this warning. Please suggest me a solution.

Link That i followed

http://book.cakephp.org/3.0/en/core-libraries/validation.html#creating-reusable-validators

  • 写回答

1条回答 默认 最新

  • douguanyan9928 2016-03-27 14:27
    关注

    In your UsersTable change the signature

    public function validationChangepass(UsersValidator $validator) 
    

    to

    public function validationChangepass(Validator $validator)
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据