如何在Laravel Validation中排除更新场景下的密码验证规则
Laravel Form Request 差异化密码验证实现方案
验证类代码修改
通过判断当前请求的方法动态调整验证规则,修改后的UsersRequest代码如下:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UsersRequest extends FormRequest { public function rules() { // 通用验证规则 $baseRules = [ 'avatar' => ['image', 'mimes:jpeg,jpg,png', 'max:700'], 'second_name' => ['required', 'max:60'], ]; // 新增用户(POST请求):密码必填 if ($this->isMethod('post')) { $baseRules['password'] = ['required', 'confirmed', 'max:255']; } // 更新用户(PUT/PATCH请求):密码可选,提交才触发验证 if ($this->isMethod('put') || $this->isMethod('patch')) { $baseRules['password'] = ['nullable', 'confirmed', 'max:255']; } return $baseRules; } }
控制器逻辑配合
更新操作时需要过滤空的密码字段,避免空值覆盖原有加密密码:
public function update(UsersRequest $request, User $user) { $validatedData = $request->validated(); // 未提交新密码则移除字段,不更新密码 if (empty($validatedData['password'])) { unset($validatedData['password']); } else { // 提交了新密码需先加密再存储 $validatedData['password'] = bcrypt($validatedData['password']); } $user->update($validatedData); // 后续自定义返回逻辑 }
补充说明
如果希望只有请求中携带password字段时才触发验证,也可以将更新场景的密码规则替换为['sometimes', 'required', 'confirmed', 'max:255'],两种写法都可以满足需求,按需选择即可。
内容的提问来源于stack exchange,提问作者Shady Hesham
相关产品推荐
相关产品推荐

