当Laravel Validator Exist默认函数失败时如何处理

mgdq6dx1  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(137)

背景

所以我有一个验证器:
1.确定电子邮件格式是否正确
1.电子邮件是否已存在于数据库中
1.与其他列沿着验证(* 忽略此 *),如下所示:

$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...
}

但这是最好的做法吗?
我认为有一种方法可以自动..
请提供建议或答案,谢谢

ndh0cuux

ndh0cuux1#

$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')
qco9c6ql

qco9c6ql2#

因此,由于Pouria Jahedi's answer所提到的答案,并通过这个引用,我们可以这样做逻辑条件作用:

if ($validator->fails()) {
     $errors = $validator->errors();
     if ($errors->first('email')) {
         return $errors->first('email');
     } else {
         return ResponseFormatter::error(null, implode(", ", $errors->all()));
     }
}

相关问题