当我们创建用户时,通常是将请求到的数据直接放到 create() 方法中去,比如这样:

    1. public function store(\Request $request)
    2. {
    3. User::create($request->toArray());
    4. }

    但是,默认密码没有加密,虽然这样可以创建用户,但是没有加密的密码既不安全,也无法登录。
    一般为了方便,就在模型中定义 password 的修改器:

    1. public function setPasswordAttribute($value)
    2. {
    3. $this->attributes['password'] = $value;
    4. }

    这样是很方便,弄完我们就可以继续开发代码了。
    但是,在 数据迁移 那一块有个坑:
    我们都知道, UserFactory.php 的密码,是默认被 hash 了的,在对应的种子文件中,一般我们使用 DB 来插入数据(因为快),但是有些时候为了图方便(可以维护 created_at 和 updated_at 字段),用 factory(User::class, 10)->create() 来迁移数据。
    这样就有问题了,这样会使用 模型来创建数据,由于我们本来的密码就被 hash 过,创建的过程就会调用 修改器 有进行一次 hash ,也就是总共会进行两次加密。就出现了问题。
    解决方法有多种:
    在 修改器 里预先判断 $value 的长度,一般 60 就可以了(很少有人的密码达到 60 个字符串吧)
    UserFactoty.php 中 password 对应的 hash 改成明文就行了。