2015-05-16 73 views
4

我是新來的Yii和我有問題,它的用戶和登錄系統Yii2用戶模型。 我應該使用登錄檢查3個表,但是當我使用自定義查詢我面對與關係表

"Argument 1 passed to yii\web\User::login() must implement interface yii\web\IdentityInterface, ActiveQuery given"

我的表是這樣的:

  • user : user_id, name, family, birthday, ...
  • email : email_user_fk, email_addr, email_active, email_cdt
  • passwd : passwd_user_fk, passwd_hashed, passwd_active, passwd_cdt

和我的查詢是這樣的: SELECT user.user_id, email.email_addr, email.email_active, passwd.passwd_hashed, passwd_passwd_active , ... FROM user JOIN email ON user.user_id = email.email_user_fk JOIN passwd ON user.user_id = passwd.passwd_user_fk WHERE email.email_addr = :email

有什麼想法嗎?

class User extends ActiveRecord implements IdentityInterface 
{ 
    const STATUS_DELETED = 0; 
    const STATUS_ACTIVE = 10; 

    /** 
    * @inheritdoc 
    */ 
    public static function tableName() 
    { 
     return 'user'; 
    } 

    public static function primaryKey(){ 
     return 'user_id'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function behaviors() 
    { 
     return [ 
      TimestampBehavior::className(), 
     ]; 
    } 


    /** 
    * @inheritdoc 
    */ 
    public static function find 

    Identity($id) 
     { 
     return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public static function findIdentityByAccessToken($token, $type = null) 
    { 
     throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); 
    } 

    /** 
    * Finds user by username 
    * 
    * @param string $username 
    * @return static|null 
    */ 
    public static function findByUsername($username) 
    { 
     return static::findOne(['email' => $username]); 
    } 

    public static function findByEmail($email) 
    { 
     return User::find() 
      ->joinWith(['emails']) 
      ->where("email.email_address = '[email protected]' ") 
      ->one(); 
    } 

    public static function findByMobile($email) 
    { 
     return User::find() 
      ->joinWith(['mobiles']) 
      ->where("mobile.mobile_address = '0931515124' ") 
      ->one(); 
    } 


    /** 
    * Finds user by password reset token 
    * 
    * @param string $token password reset token 
    * @return static|null 
    */ 
    public static function findByPasswordResetToken($token) 
    { 
     if (!static::isPasswordResetTokenValid($token)) { 
      return null; 
     } 

     return static::findOne([ 
      'password_reset_token' => $token, 
      'status' => self::STATUS_ACTIVE, 
     ]); 
    } 

    /** 
    * Finds out if password reset token is valid 
    * 
    * @param string $token password reset token 
    * @return boolean 
    */ 
    public static function isPasswordResetTokenValid($token) 
    { 
     if (empty($token)) { 
      return false; 
     } 
     $expire = Yii::$app->params['user.passwordResetTokenExpire']; 
     $parts = explode('_', $token); 
     $timestamp = (int) end($parts); 
     return $timestamp + $expire >= time(); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getId() 
    { 
     return $this->getPrimaryKey(); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getAuthKey() 
    { 
     return $this->auth_key; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function validateAuthKey($authKey) 
    { 
     return $this->getAuthKey() === $authKey; 
    } 

    /** 
    * Validates password 
    * 
    * @param string $password password to validate 
    * @return boolean if password provided is valid for current user 
    */ 
    public function validatePassword($password) 
    { 
     return Yii::$app->security->validatePassword($password, $this->password_hash); 
    } 

    /** 
    * Generates password hash from password and sets it to the model 
    * 
    * @param string $password 
    */ 
    public function setPassword($password) 
    { 
     $this->password_hash = Yii::$app->security->generatePasswordHash($password); 
    } 

    /** 
    * Generates "remember me" authentication key 
    */ 
    public function generateAuthKey() 
    { 
     $this->auth_key = Yii::$app->security->generateRandomString(); 
    } 

    /** 
    * Generates new password reset token 
    */ 
    public function generatePasswordResetToken() 
    { 
     $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); 
    } 

    /** 
    * Removes password reset token 
    */ 
    public function removePasswordResetToken() 
    { 
     $this->password_reset_token = null; 
    } 

    public function rules() 
    { 
     return [ 
      [['user_name', 'user_family', 'user_birthday'], 'required'], 
      [['user_gender', 'city_id_fk', 'user_status'], 'integer'], 
      [['user_birthday', 'user_cdt'], 'safe'], 
      [['user_name'], 'string', 'max' => 32], 
      [['user_family'], 'string', 'max' => 48], 
      [['user_tel', 'user_postcode'], 'string', 'max' => 12], 
      [['user_address'], 'string', 'max' => 128], 
      [['user_profile_image', 'user_cover_image'], 'string', 'max' => 256] 
     ]; 
    } 



    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getEmails() 
    { 
     return $this->hasMany(Email::className(), ['email_user_id_fk' => 'user_id']); 
    } 


    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getMobiles() 
    { 
     return $this->hasMany(Mobile::className(), ['mobile_user_id_fk' => 'user_id']); 
    } 


    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getPasswds() 
    { 
     return $this->hasMany(Passwd::className(), ['passwd_user_id_fk' => 'user_id']); 
    } 

} 
+0

顯示您的用戶模式或其中定義的login()方法 – scaisEdge

+0

@scaisEdge模型 - 比如我要定義的函數findByEmail(),但電子郵件列不會在用戶表存儲。電子郵件已將表格與一對多關係分開。我需要加入用戶表和電子郵件表,其中email_active爲true – masoud

+0

在你的代碼中,你似乎沒有正確實現'user interface'。似乎沒有'findIndentity()'方法。接口的實現必須實現所有的接口方法。 – scaisEdge

回答

1

這是什麼錯誤顯示的是,當你執行的Yii :: $ APP->用戶>登錄()在某些時候你必須通過實現身份接口爲參數的用戶對象(而且似乎你正在傳遞另一種類型的對象)。

什麼這種方法確實是讓您保存從記錄後,用戶的信息。首先用戶提供一個用戶名,然後它必須從數據庫中檢索這個用戶名的信息,並用這個信息安裝一個用戶對象。這是你必須傳遞給Yii :: $ app-> user-> login()函數的對象。

閱讀User類here

,並找到一個很好的樣本here