Laravel 5.5表单验证unique规则更新失效,无法获取$user对象
解决Laravel 5.5更新时Unique验证规则失效问题
我之前帮同事处理过一模一样的Laravel升级问题,核心原因是5.2到5.5版本之间,表单请求类里获取路由绑定模型的逻辑变了。你在5.2里能直接用$user->id,但在5.5的表单请求规则方法中,这个变量并没有被自动注入,导致unique规则里的排除ID为空,自然触发了重复验证错误。
下面给你两种针对性的解决方案,根据你的路由配置选择即可:
方案一:利用路由模型绑定(推荐)
如果你的更新路由已经做了模型绑定,类似这样:
Route::put('/users/{user}', 'UserController@update');
那在表单请求的rules()方法里,你可以通过$this->route('user')直接拿到绑定的User模型,修改email的验证规则就能解决问题:
public function rules() { // 从路由中获取绑定的用户模型 $user = $this->route('user'); $retVal = [ 'username' => 'required|alpha_dash|min:4|max:30', 'password' => 'min:6|confirmed', 'password_confirmation' => 'min:6', // 替换为路由模型的ID 'email' => 'required|email|unique:users,email,' . $user->id, 'roles_list' => 'required', ]; if (stristr($this->get('username'), '@')) { $retVal['username'] = 'required|email'; } return $retVal; }
方案二:直接获取路由ID参数
如果你的路由没有做模型绑定,只是传递了用户ID:
Route::put('/users/{id}', 'UserController@update');
那可以直接从路由中提取ID值来使用:
public function rules() { $userId = $this->route('id'); $retVal = [ // ...其他规则保持不变 'email' => 'required|email|unique:users,email,' . $userId, // ...其他规则保持不变 ]; // 剩下的逻辑和原来一致 if (stristr($this->get('username'), '@')) { $retVal['username'] = 'required|email'; } return $retVal; }
补充说明
Laravel 5.5之后,表单请求类不会再把路由绑定的模型直接作为类属性暴露出来,必须通过$this->route($paramName)方法主动获取。这就是为什么你手动输入ID能生效,但直接用$user变量不行的原因——这个变量在当前规则方法的上下文中根本不存在。
另外要注意,如果用路由模型绑定,需要保证你的User模型和路由参数名(比如{user})一致,Laravel才能自动完成模型注入。
内容的提问来源于stack exchange,提问作者tobe
相关产品推荐
相关产品推荐

