Laravel使用Form Request更新数据时如何验证邮箱唯一性
问题原因
你写的代码不生效的核心原因是$this->user()获取的是当前发起请求的登录用户身份,而非你要更新的目标用户ID,所以唯一规则排除的对象错误,验证逻辑自然不符合预期。如果是管理员更新其他用户信息的场景,这种写法会直接排除当前登录的管理员ID而非要修改的目标用户ID,自然验证不通过。
正确获取目标用户ID的方法
Laravel的Form Request实例可以直接通过route()方法获取路由参数里的变量,通常更新用户的路由都会携带目标用户的ID参数,示例如下:
- 假设你的更新路由定义为:
Route::put('/users/{user}', [UserController::class, 'update'])(如果是资源路由默认就是该参数结构) - 直接在rules方法中通过
$this->route('user')获取目标用户的参数值,如果你的路由参数名不是user,替换为你实际定义的参数名即可。
如果已经做了路由模型绑定,路由参数会自动解析为用户模型,写法如下:
public function rules() { return [ 'name' => 'required|max:255|string', 'email' => 'required|email|max:255|unique:users,email,'.$this->route('user')->id, 'restaurant' => 'required', ]; }
如果路由参数是纯数字ID没有做模型绑定,直接取即可:
'email' => 'required|email|max:255|unique:users,email,'.$this->route('user'),
更规范的写法推荐
Laravel 5.7及以上版本推荐使用Rule类构造唯一验证规则,可读性更高,也避免字符串拼接出错:
首先引入Rule类:use Illuminate\Validation\Rule;
然后rules方法写法:
public function rules() { return [ 'name' => ['required', 'max:255', 'string'], 'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($this->route('user'))], 'restaurant' => ['required'], ]; }
如果路由参数绑定的是模型,也可以直接传模型实例给ignore方法,Laravel会自动读取主键ID。
内容的提问来源于stack exchange,提问作者ihprince
相关产品推荐
相关产品推荐

