2013-02-18 40 views
0

我正在使用cakephp。我需要在电子邮件字段中添加三个验证。首先验证是否给出电子邮件地址,其次是有效的电子邮件地址,如果给出了第三个电子邮件地址,则应该是唯一的。因为它是一个注册表单。cakephp notempty字段上的空白和唯一验证

我如何在一个字段中添加三个验证,我尝试使用以下代码,但它对我无效。

public $validate = array(
     'email' => array(
      'email' => array(
       'rule' => array('email'), 
       'message' => 'Invalid email address', 
       'allowEmpty' => false, 
       //'required' => false, 
       //'last' => false, // Stop validation after this rule 
       //'on' => 'create', // Limit validation to 'create' or 'update' operations 
      ) 
     ), 
     'email' => array(
       'rule' => 'isUnique', 
       'message' => 'Email already registered' 
      ) 
); 

回答

14

您有两个相同的索引'email',PHP不允许你。更改类似: -

array(
    'email' => array(
     'notEmpty' => array(
      'rule' => 'notEmpty', 
      'message' => 'Provide an email address' 
     ), 
     'validEmailRule' => array(
      'rule' => array('email'), 
      'message' => 'Invalid email address' 
     ), 
     'uniqueEmailRule' => array(
      'rule' => 'isUnique', 
      'message' => 'Email already registered' 
     ) 
    ) 
); 

否则,只会使用您的一条规则。

+0

它的工作原理是这样

 'email'=>array( 'notempty'=>array( 'rule'=>'notempty', 'message'=>'Required Field' ), 'email'=>array( 'rule'=>'email', 'message'=>'Enter Valid Email' ), 'isUnique'=>array( 'rule'=>'isUnique', 'message'=>'Email Already Exists' ) ) 
nbhatti2001 2013-02-18 10:05:28

0

你使用的是什么版本的CakePHP?

因为我觉得,如果你使用2.3,它应该是:

public $validate = array('email' => 'email'); 

在你的SQL表中的字段设置电子邮件作为主键。

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; 
}