Laravel唯一验证需追加后缀:验证带.test.co.uk的域名唯一性
Laravel验证时自动拼接域名后缀检查唯一性的便捷方案
这个场景我做多租户项目时也碰到过,Laravel提供了几种简洁的方式解决,不用写复杂逻辑,分享两个最实用的方法:
方法一:预处理输入字段(推荐,适合需要存储完整域名的场景)
你可以在继承FormRequest的请求类里重写prepareForValidation方法,自动把用户输入的前缀和.test.co.uk拼接好,后续验证和存储直接用完整域名:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class DomainStoreRequest extends FormRequest { // 授权逻辑(如果需要) public function authorize() { return true; } // 预处理输入,拼接完整域名 protected function prepareForValidation() { $this->merge([ 'url' => $this->input('url') . '.test.co.uk', ]); } public function rules() { return [ 'url' => 'required|string|unique:domains,domain', ]; } }
这样验证时会直接检查拼接后的完整域名是否重复,而且后续从请求中取$request->url时,拿到的就是johnsmith.test.co.uk这种完整值,直接存入数据库即可。
方法二:自定义Unique查询规则(适合需要保留原始前缀输入的场景)
如果后续逻辑还需要用到用户输入的原始前缀,不想修改请求数据,可以用Rule::unique配合闭包动态拼接后缀做验证:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; class DomainStoreRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'url' => [ 'required', 'string', Rule::unique('domains', 'domain')->where(function ($query) { $fullDomain = $this->input('url') . '.test.co.uk'; return $query->where('domain', $fullDomain); }), ], ]; } }
这种方式不会改动请求里的原始url值,仅在验证唯一性时检查数据库中是否存在拼接后的完整域名。
额外提示:更新场景兼容
如果这个请求同时用于创建和更新域名,更新时需要排除当前记录本身,可以给Rule::unique追加ignore方法:
Rule::unique('domains', 'domain') ->where(fn ($query) => $query->where('domain', $fullDomain)) ->ignore($this->route('domain')) // 假设路由参数是域名模型或ID
这样更新时就不会把当前记录判定为重复项了。
内容的提问来源于stack exchange,提问作者Riz
相关产品推荐
相关产品推荐

