cakephp模型中的电子邮件验证

时间:2016-02-16 12:19:31

标签: php validation cakephp cakephp-2.6

我有以下验证规则设置。出于某种原因,'on' => 'create'阻止不起作用。要实施的条件是关于电子邮件的标准创建/修改。另外,在编辑部分,我收到'on' => 'create'阻止的错误。

如何验证电子邮件?我正在使用CakePHP v 2.6.1。

public $validate = array(
    'email' => array(
        'required' => array(
            'rule' => array('email'),
            'message' => 'Kindly provide your email for verification.'
        ),
        'maxLength' => array(
            'rule' => array('maxLength', 255),
            'message' => 'Email cannot be more than 255 characters.'
        ),
        'editunique' => array(
            'rule' => array('editunique'),
            'message' => 'Provided Email address already exists.',
            'on' => 'update'
        ),
        'unique' => array(
            'rule' => 'isUnique',
            'message' => 'Provided Email already exists.',
            'on' => 'create'
        )
    )
);


public function editunique($email) {
    // email should be one and of the logged in user only.
    if ($this->find('count', array(
        'conditions' => array(
            $this->alias . '.id <>' => $this->data[$this->alias]['id'],
            $this->alias . '.email' => $email
        )
    )) > 1) {
        return false;
    }

}

另外,我没有得到$this->data[$this->alias]['id']值。

我的控制器有以下部分:

if ($this->Client->hasAny(array('Client.id' => base64_decode(trim($this->request->query['client_id']))))){
            if ( $this->request->is('ajax') && $this->request->is('post') ){
                $this->Client->create();
                $this->Client->id = base64_decode(trim($this->request->query['client_id']));
                $this->Client->set($this->request->data);
                // validate
                if($this->Client->validates()) {
                    // save the data after validation
                    if($this->Client->save($this->request->data)){
                     }
                 }
             }
        }

2 个答案:

答案 0 :(得分:1)

我认为你误解了Cake的isUnique规则检查的结果,以及因为复杂的事情。蛋糕defines isUnique为: -

  

该字段的数据必须是唯一的,任何其他行都不能使用

当它检查某个值是否唯一时,它足够聪明,可以排除当前行的现有数据(这似乎是您尝试对editunique规则执行的操作)。

所以你只需要你的验证规则: -

public $validate = array(
    'email' => array(
        'required' => array(
            'rule' => array('email'),
            'message' => 'Kindly provide your email for verification.'
        ),
        'maxLength' => array(
            'rule' => array('maxLength', 255),
            'message' => 'Email cannot be more than 255 characters.'
        ),
        'unique' => array(
            'rule' => 'isUnique',
            'message' => 'Provided Email already exists.'
        )
    )
);

这会删除editunique规则并删除on规则的unique条件。

答案 1 :(得分:0)

从实体表中的cakephp 3.0开始,它应该看起来像这样

   namespace App\Model\Table;

   public function validationDefault($validator)
   {
    $validator
        ->email('email')
        ->add('email', 'email', [
            'rule' => [$this, 'isUnique'],
            'message' => __('Email already registered')
        ])
        ->requirePresence('email', 'create')
        ->notEmpty('email', 'Email is Required', function( $context ){
            if(isset($context['data']['role_id']) && $context['data']['role_id'] != 4){
                return true;
            }
            return false;
        });
    return $validator;
}
}


function isUnique($email){
    $user = $this->find('all')
        ->where([
                'Users.email' => $email,
          ])
        ->first();
        if($user){
            return false;
        }
        return true;
}