@sachu 確實在生產環境中也會需要檢查,但教學可能因較著重在大方向而沒有著墨這種細節
不過既然樓主提到了,文件的表單驗證中有提到解決方式:
强迫 Unique 规则忽略指定 ID :
有时,你可能希望在进行字段唯一性验证时忽略指定 ID 。例如, 在「更新个人资料」页面会包含用户名、邮箱和地点。这时你会想要验证更新的 E-mail 值是否唯一。如果用户仅更改了用户名字段而没有改 E-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 E-mail 的拥有者了。
使用 Rule 类定义规则来指示验证器忽略用户的 ID。这个例子中通过数组来指定验证规则,而不是使用 | 字符来分隔:
use Illuminate\Validation\Rule; Validator::make($data, [ 'email' => [ 'required', Rule::unique('users')->ignore($user->id), ], ]);
如果你的数据表使用的主键名称不是 id ,那就在调用 ignore 方法时指定字段的名称:
'email' => Rule::unique('users')->ignore($user->id, 'user_id')
@sachu 確實在生產環境中也會需要檢查,但教學可能因較著重在大方向而沒有著墨這種細節
不過既然樓主提到了,文件的表單驗證中有提到解決方式:
强迫 Unique 规则忽略指定 ID :
有时,你可能希望在进行字段唯一性验证时忽略指定 ID 。例如, 在「更新个人资料」页面会包含用户名、邮箱和地点。这时你会想要验证更新的 E-mail 值是否唯一。如果用户仅更改了用户名字段而没有改 E-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 E-mail 的拥有者了。
使用 Rule 类定义规则来指示验证器忽略用户的 ID。这个例子中通过数组来指定验证规则,而不是使用 | 字符来分隔:
use Illuminate\Validation\Rule; Validator::make($data, [ 'email' => [ 'required', Rule::unique('users')->ignore($user->id), ], ]);
如果你的数据表使用的主键名称不是 id ,那就在调用 ignore 方法时指定字段的名称:
'email' => Rule::unique('users')->ignore($user->id, 'user_id')
@sachu 確實在生產環境中也會需要檢查,但教學可能因較著重在大方向而沒有著墨這種細節
不過既然樓主提到了,文件的表單驗證中有提到解決方式:
强迫 Unique 规则忽略指定 ID :
有时,你可能希望在进行字段唯一性验证时忽略指定 ID 。例如, 在「更新个人资料」页面会包含用户名、邮箱和地点。这时你会想要验证更新的 E-mail 值是否唯一。如果用户仅更改了用户名字段而没有改 E-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 E-mail 的拥有者了。
使用 Rule 类定义规则来指示验证器忽略用户的 ID。这个例子中通过数组来指定验证规则,而不是使用 | 字符来分隔:
use Illuminate\Validation\Rule; Validator::make($data, [ 'email' => [ 'required', Rule::unique('users')->ignore($user->id), ], ]);
如果你的数据表使用的主键名称不是 id ,那就在调用 ignore 方法时指定字段的名称:
'email' => Rule::unique('users')->ignore($user->id, 'user_id')
public function messages()
{
return [
'name.required' => '用户名不能为空。',
'name.between' => '用户名必须介于 3 - 25 个字符之间。',
'name.regex' => '用户名只支持中文、数字、字母、下划线。',
'name.unique' => '用户名已存在。',
'email.required' => '邮箱不能为空。',
'email.email' => '请填写正确的邮箱地址。',
'introduction.max' => '个人简介最多80个字符。',
];
}
@ruodee
那比如,2个用户A和B,注册时邮箱不一样,然后B在修改资料时把自己的邮箱改成和A一样的了,这样不对吧?
因为修改资料时email并没有unique,所以无法避免这种情况。
所以是不是这里也必须要把email的验证加上unique?
@holyLight 修改邮箱一般使用发送验证码验证,以防止恶意测试邮箱是否被注册。还比如用户登录验证的时候,不具体返回用户名不存在、密码错误,而是一般返回“用户名或密码错误”,也是防止专门性的探测、针对。邮箱唯一性的验证不妨放在邮箱验证码验证之后。
如果在此加入邮箱唯一性验证,每次修改用户其他资料而不改变邮箱的时候,都会返回邮箱已存在的错误,所以同用户名唯一性验证一样,要加入忽略自身的条件。
推荐文章: