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