背景
所以我有一個驗證器:
- 判斷郵件格式是否正確
- 該電子郵件是否已存在于資料庫中
- 連同其他一些列驗證(忽略這個)就像這樣:
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:MyTable,email',
'mobile' => ['required', 'regex:/^(62)8[1-9][0-9]{6,9}$/'], // Valid: 6281234567890
'birthdate' => 'required|date',
'password' => ['required', 'confirmed', Password::min(8)->mixedCase()->numbers()],
'allow_received_information' => 'integer',
]);
如果輸入表單有錯誤,會一一顯示錯誤資訊,代碼如下:
if ($validator->stopOnFirstFailure()->fails()) {
return ResponseFormatter::error(null, implode(",", $validator->messages()->all()));
}
問題
所以我的問題是,如果電子郵件已經存在于資料庫中或其他驗證中不存在,如何捕獲事件?也許就這么簡單:
if ('email' == alreadyExistFunc()) {
# if already exist in db
} else {
# if not
}
試用 1
我從Laravel 的 After Validation Hook中找到了一些功能,但我不知道這是否正是我需要的功能,我也不知道如何使用它。
$validator = Validator::make();
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add(
'field', 'Something is wrong with this field!'
);
}
});
if ($validator->fails()) {
//
}
試用 2
我可以'email' => 'required|string|email|max:255|unique:MyTable,email'從規則代碼行中洗掉電子郵件驗證,然后像這樣手動執行:
$isExist = MyTable::where('email', $request->email)->first();
if ($isExist != null) {
# code...
} else {
# code...
}
但這是最佳實踐嗎?
我認為有一種方法可以自動..
求建議或解答,謝謝
uj5u.com熱心網友回復:
$validator = Validator::make($request->all(), [
'email' => 'required|unique:MyTable,email|string|email|max:255',
'name' => 'required|string|max:255',
]);
這是 Laravel API 中可用于 $error 訊息包的方法串列:https ://laravel.com/api/master/Illuminate/Contracts/Support/MessageBag.html
您可以獲得所有錯誤鍵的串列:
$error->keys()
或錯誤串列:
$errors->all()
或通過其關鍵的特定錯誤:
$error->get('email')
uj5u.com熱心網友回復:
因此,感謝Pouria Jahedi 的回答中提到的答案,并通過此參考資料,我們可以像這樣進行邏輯條件處理:
if ($validator->fails()) {
$errors = $validator->errors();
if ($errors->first('email')) {
return $errors->first('email');
} else {
return ResponseFormatter::error(null, implode(", ", $errors->all()));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/535782.html
標籤:PHP拉维验证
