Yii2更改用户';自动输入密码

Yii2更改用户';自动输入密码,yii2,Yii2,我有一个名为user的模型。此型号具有密码、媒体id和许多其他属性 我想使用此方法更改单个属性: $user = User::find() ->where([ "id" => $id ]) ->one(); $user->media_id = null; if($user->save()){ return [

我有一个名为
user
的模型。此型号具有
密码
媒体id
和许多其他属性

我想使用此方法更改单个属性:

$user = User::find()
            ->where([
                "id" => $id
            ])
            ->one();
        $user->media_id = null;
        if($user->save()){
            return [
                "ok" => true
            ];
        }
        else{
            return [
                "ok" => false,
                "result" => $user->errors
            ];
        }
但当我运行此代码时,密码字段将更改为未知值,因此用户无法再登录

但当我使用以下方法时:

User::updateAll([
            "media_id" => null
        ],
            [
                "id" => $id
            ]);
我的查询工作正常。第一个代码有什么问题

更新1:

这是规则:

public function rules() {
        return [
                ['password', 'required', 'message' => 'لطفا کلمه عبور خود را وارد نمایید', 'on' => 'register'],
                ['email', 'required', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
                ['email', 'duplicateEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
                ['email', 'validateRegisterEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'register'],
                ['email', 'required', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
                ['email', 'duplicateEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
                ['email', 'validateRegisterEmail', 'message' => 'لطفا ایمیل خود را وارد نمایید', 'on' => 'changeEmail'],
//            [['code', 'first_name', 'last_name', 'gender', 'mobile', 'email', 'password', 'bio', 'degree', 'favorites', 'type', 'active', 'active_mobile', 'active_email', 'modified_password', 'created', 'modified', 'deleted'], 'required'],
                [['gender', 'media_id', 'cover_media_id', 'type', 'active', 'active_mobile', 'active_email', 'deleted'], 'integer'],
                [['degree', 'bio', 'favorites'], 'string'],
                [['modified_password', 'created', 'modified'], 'safe'],
                [['code'], 'string', 'max' => 10],
                [['forget_password_token'], 'string', 'max' => 32],
                [['first_name', 'last_name', 'email'], 'string', 'max' => 50, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد'],
                [['mobile'], 'string', 'max' => 12, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد'],
                [['password'], 'string', 'max' => 20, 'message' => 'تعداد کاراکتر بیش از حد مجاز می باشد', 'on' => 'register'],
                [['media_id'], 'exist', 'skipOnError' => true, 'targetClass' => Media::className(), 'targetAttribute' => ['media_id' => 'id']],
                [['cover_media_id'], 'exist', 'skipOnError' => true, 'targetClass' => Media::className(), 'targetAttribute' => ['cover_media_id' => 'id']],
                ['type', 'default', 'value' => 1],
                ['type', 'in', 'range' => [self::ROLE_USER, self::ROLE_INSTRUCTOR, self::ROLE_AUTHOR, self::ROLE_MANAGER, self::ROLE_INVESTOR]],
        ];
    }
我已经测试了
save(false)
,但仍然更改了密码

我还测试了
model.validate()
,密码没有改变

密码在我运行
model.save()时更改。

这是我的

这就是原因
$notChangePassword
null
的默认值,因此
$this->setPassword($this->password)
将在每次
save()
时调用(并且哈希已哈希化的密码)

我建议不要对原始密码和散列密码使用相同的属性。您可以引入
$rawPassword
属性,并在表单中使用它来代替
$password

class User extends ActiveRecord implements IdentityInterface {

    public $rawPassword;

    public function beforeSave($insert) {
        if (parent::beforeSave($insert)) {
            if (!empty($this->rawPassword)) {
                $this->setPassword($this->rawPassword);
            }
            return true;
        }
    }

    // ...
}
这就是原因
$notChangePassword
null
的默认值,因此
$this->setPassword($this->password)
将在每次
save()
时调用(并且哈希已哈希化的密码)

我建议不要对原始密码和散列密码使用相同的属性。您可以引入
$rawPassword
属性,并在表单中使用它来代替
$password

class User extends ActiveRecord implements IdentityInterface {

    public $rawPassword;

    public function beforeSave($insert) {
        if (parent::beforeSave($insert)) {
            if (!empty($this->rawPassword)) {
                $this->setPassword($this->rawPassword);
            }
            return true;
        }
    }

    // ...
}

您可能在验证规则或
beforeSave()
中有一些奇怪的魔力。在未经验证的情况下使用save函数,如$user->save(false)从您的
user
模型中添加
rules()
。您可能在验证规则或
beforeSave()
中有一些奇怪的魔力。在未经验证的情况下使用save函数,如$user->save>(false)从您的
用户
模型中添加
规则()
。如果删除内部
如果
,会发生什么?如果删除内部
如果
,会发生什么?