我是Yii的新手,我的用户和登录系统有问题。 我应该使用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 = 'me@mail.com' ")
            ->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']);
    }

}

===============>>#1 票数:1

该错误显示的是,在执行Yii :: $ app-> user-> login()时,您必须传递一个将身份接口实现为参数的User对象(看来您正在传递另一种对象) )。

此方法的作用是允许您在登录后保存来自用户的信息。 首先,用户提供用户名,然后必须从数据库中检索该用户名的信息,并使用该信息将用户对象设置为无效。 这是您必须传递给Yii :: $ app-> user-> login()函数的对象。

在此处阅读有关User类的信息

在这里找到一个很好的样本。

  ask by masoud translate from so

未解决问题?本站智能推荐:

1回复

如何在yii2中建立多种模型的形式?

我正在尝试创建一个使用多个模型实例的表单,然后一次提交所有表单(表格输入) ,我已经在yiiframework上阅读了这篇文章 ,但是我试图做的是构建一个包含属性和属性的自定义模型来自多个模型,然后在我的表单中使用此模型。 [例] 模型1 摩尔2
1回复

在ActiveDataProvider,Yii2中获取模型索引

我尝试在dataProvider获取我的模型位置。 我有一个带有寻呼机的列表视图: 我知道我可以在部分视图tree_part.php访问$model, $widget, $index ,但我无法弄清楚如何在数据中获取当前的$model索引。 我的数据提供者: 因此,如果p
1回复

yii2重写模型addError

这是原始的Model.php函数 在我的模型属性中,我想以这种方式覆盖此方法 我无法访问$ this-> _ errors ...我不知道如何在不修改main model.php的情况下覆盖该函数。
1回复

yii2如何从表中获取正确的URL

我创建了一个动态导航栏菜单,但是无法通过参数获取正确的URL。 这是我的模型代码的一部分: 我的页面动作: 我的静态路由是: ['label' => Yii::t('frontend', 'About'), 'url' => ['/page/view', 'sl
1回复

Yii2 - 如何在用户身份中设置动态authTimeout?

在这里,我扩展了Yii2的User身份。 这是我的配置。 在这里,我已经静态定义了authTimout 。 但是,我想要做的是我想从数据库中获取超时值并在authTimeout设置它。 谢谢。
2回复

制作或更改密码后用户不要在Yii2中登录

制作或编辑密码后用户我在Yii2中有登录错误'用户名或密码不正确' 使用用户'admin'登录是可行的(我使用actionCreate1创建管理员用户) 但我使用户或编辑密码,在登录页面我有错误:'用户名或密码不正确' 我认为来自模型USER中的beforeSave的问题
1回复

yii2 IdentityInterface中的多个登录表在登录时出错

我有2个不同的表user和organiser并且我试图为两个用户创建2个不同的登录名。 我能够轻松注册它们并获取数据库中的记录,但是保存记录后,我在以下代码行中收到错误 以下是我的configuration模块 那我在这儿怎么了? 我是否需要创建任何其他接口或其他东西或为
2回复

Yii2中的验证

我希望我的数量 [ 字段名称 ]必须为零(0 )或正数 我在模型中定义以下规则。 而且它工作正常 。 并在我尝试输入负值时显示错误消息。 但是问题是它接受-0 [ 减零 ] 如何限制用户不输入-0 ? 谢谢
1回复

Yii2中的findBySql不返回预期结果集

我正在使用Yii2,对于我的数据表,我需要分类的数据并限制每个类别的数据。为了实现其结果,我使用了findBySql(),但它始终从该模型返回完整的结果集。 它工作正常,但我想与模型一起使用,这样我就可以拥有实例 我只希望以下查询给我yii \\ db \\ ActiveQuery实
1回复

Yii2与MongoDB一起使用

我是Yii2的新手。 我想在Yii2上使用MongoDB。 为此,我找到了这个库: https://github.com/yiisoft/yii2-mongodb 问题是它没有对安装和配置进行太多解释。 如我所读,我已将以下内容添加到common\\config\\ma