You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel框架中Validator::make校验完成后如何对密码执行Hash加密?

实现方案

问题原因

  • 原有写法不生效有两个核心问题:
    1. 你代码里的$data本身是Validator实例,不是校验后的数据集合,safe()方法返回的是只读的校验数据对象,不能直接对其返回值赋值
    2. only('password')返回的是包含password键的数组,不能直接作为左值赋值修改原校验数据
  • 额外注意原有校验规则里name的规则分隔符写错了,min:3:max:20要改成min:3|max:20,否则规则会失效

正确实现逻辑

校验通过后先把所有合规数据提取为可修改的数组,再修改密码字段即可,全程不需要碰Request原始数据,所有操作都基于校验后的合规数据:

  1. 校验通过后调用validated()方法拿到所有经过校验的合规数据数组
  2. 覆盖数组中的password字段为加密后的值
  3. 把处理后的数组传入模型的create方法

修改后的完整代码

public function create(Request $request){
    $validator = Validator::make($request->only(['name', 'email', 'password']), [
        'name' => 'required|min:3|max:20', // 修正了规则分隔符
        'email' => 'required|email|unique:users',
        'password' => 'required|min:6',
    ]);

    if ($validator->fails()) {
        // 原有错误处理逻辑
    }else{
        // 拿到校验后的所有合规数据
        $validated = $validator->validated();
        // 加密密码
        $validated['password'] = Hash::make($validated['password']);
        // 写入数据库
        User::create($validated);
    }
}

如果你只需要部分校验字段,可以把validated()换成$validator->safe()->only(['name', 'email', 'password']),拿到的也是可修改的数组,后续加密逻辑完全一致。

内容的提问来源于stack exchange,提问作者user_m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:09:04