当我们创建用户时,通常是将请求到的数据直接放到 create() 方法中去,比如这样:
public function store(\Request $request)
{
User::create($request->toArray());
}
但是,默认密码没有加密,虽然这样可以创建用户,但是没有加密的密码既不安全,也无法登录。
一般为了方便,就在模型中定义 password 的修改器:
public function setPasswordAttribute($value)
{
$this->attributes['password'] = $value;
}
这样是很方便,弄完我们就可以继续开发代码了。
但是,在 数据迁移 那一块有个坑:
我们都知道, UserFactory.php
的密码,是默认被 hash 了的,在对应的种子文件中,一般我们使用 DB 来插入数据(因为快),但是有些时候为了图方便(可以维护 created_at 和 updated_at 字段),用 factory(User::class, 10)->create()
来迁移数据。
这样就有问题了,这样会使用 模型来创建数据,由于我们本来的密码就被 hash 过,创建的过程就会调用 修改器 有进行一次 hash ,也就是总共会进行两次加密。就出现了问题。
解决方法有多种:
在 修改器 里预先判断 $value 的长度,一般 60 就可以了(很少有人的密码达到 60 个字符串吧)
将 UserFactoty.php
中 password 对应的 hash 改成明文就行了。