Laravel框架中Validator::make校验完成后如何对密码执行Hash加密?
实现方案
问题原因
- 原有写法不生效有两个核心问题:
- 你代码里的
$data本身是Validator实例,不是校验后的数据集合,safe()方法返回的是只读的校验数据对象,不能直接对其返回值赋值 only('password')返回的是包含password键的数组,不能直接作为左值赋值修改原校验数据
- 你代码里的
- 额外注意原有校验规则里
name的规则分隔符写错了,min:3:max:20要改成min:3|max:20,否则规则会失效
正确实现逻辑
校验通过后先把所有合规数据提取为可修改的数组,再修改密码字段即可,全程不需要碰Request原始数据,所有操作都基于校验后的合规数据:
- 校验通过后调用
validated()方法拿到所有经过校验的合规数据数组 - 覆盖数组中的password字段为加密后的值
- 把处理后的数组传入模型的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
相关产品推荐
相关产品推荐

