Yii2:验证密码和对密码进行加密后入库

Introduction

在开发中遇到一个问题:

1
2
3
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
//...
}

Solve

然后这里有个密码需要通过bcrypt加密,但是$model->load()显然已经将数据全部装填好了。
在经历了一系列麻烦的操作之后忽然意识到:

1
2
3
4
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$model->password = Yii::$app->getSecurity()->generatePasswordHash($model->password);
$model->save();
}

然后发现的确可以!

如果在model中提前声明好了这些field的类属性,会造成save()无法完成填充,一般不要设置这些class属性。

但新的问题摆在眼前,因为我的rules是这样写的:

1
2
3
//...
['password', 'string', 'length' => [8, 20], 'on' => ['create', 'update'],
//...

对长度做了限制,然后即便是我在validate()之后修改的数据,但是在save()的时候它仍会隐式的调用validate()来验证数据的合法性,当然加密后的文本肯定通不过,于是数据没有被添加进去!

经过一番搜索发现,解决问题的方法简单异常:

1
$model->save(false);//取消save的验证

问题解决!
以上


感谢:
Paystey