如何在 Laravel 中执行此自定义输入表单验证(如果 username\e-mail 仍存在于数据库中)?

How can I perform this custom input form validation (if the username\e-mail yet exists in the DB) in Laravel?

我是 Laravel 的新手,我对如何实现自定义表单输入验证器有以下疑问。

我说明一下我的情况:

我有一个包含注册表单的视图:

@extends('layouts.app')

@section('content')

    <div class="row">

        <div class="col-md-12">

            <!--<h1 class="page-header"><i class="glyphicon glyphicon-file"></i> Aggiungi un utente albergatore</h1>-->
            <h1 class="page-header"><i class="fa fa-bed" aria-hidden="true" style="margin-right: 2%"></i>Aggiungi un utente albergatore</h1>

            @if (count($errors) > 0)
                <div class="alert alert-danger">
                    <strong>Whoops!</strong> Sono stati riscontrati errori nel tuo input.<br /><br />
                    <ul>
                        @foreach ($errors->all() as $error)
                            <li>{{ $error }}</li>
                        @endforeach
                    </ul>
                </div>
            @endif


            <form method="post" action="/registration">

                <div class="form-group">
                    <label>Nome</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-user"></i></div>
                        <input type="text" name="name" class="form-control" placeholder="Inserisci il tuo nome">
                    </div>
                </div>

                <div class="form-group">
                    <label>Cognome</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-user"></i></div>
                        <input type="text" name="surname" class="form-control" placeholder="Inserisci il tuo cognome">
                    </div>
                </div>

                <div class="form-group">
                    <label>Username</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-user"></i></div>
                        <input type="text" name="login" class="form-control" placeholder="Inserisci il tuo username">
                    </div>
                </div>

                <div class="form-group">
                    <label>E-mail</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-envelope"></i></div>
                        <input type="email" name="email" class="form-control" placeholder="Inserisci il tuo indirizzo e-mail">
                    </div>
                </div>

                <div class="form-group">
                    <label>Conferma e-mail</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-envelope"></i></div>
                        <input type="email" name="email_confirmation" class="form-control" placeholder="Inserisci il tuo indirizzo e-mail">
                    </div>
                </div>

                <div class="form-group">
                    <label>Password</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-lock"></i></div>
                        <input type="password" name="pass" class="form-control" placeholder="Inserisci la tua password">
                    </div>
                </div>

                <div class="form-group">
                    <label>Conferma password</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-lock"></i></div>
                        <input type="password" name="pass_confirmation" class="form-control" placeholder="Inserisci la tua password">
                    </div>
                </div>


                <div class="form-group">
                    <label>Captcha</label>
                    <div class="input-group">
                        {!! app('captcha')->display(); !!}
                    </div>
                </div>

                {{csrf_field()}}

                <button type="submit" class="btn btn-default">Submit</button>

            </form>

        </div>

    </div>


@endsection

如您在前面的代码中所见,此视图包含此部分,该部分迭代可能的 "syntax" 错误,并在输入未通过验证时显示在此页面中:

        @if (count($errors) > 0)
            <div class="alert alert-danger">
                <strong>Whoops!</strong> Sono stati riscontrati errori nel tuo input.<br /><br />
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif

这是处理表单提交的控制器方法:

public function store(Request $request) {

    Log::info('store() START');

    $data = Input::all();

    Log::info('INSERTED DATA: '.implode("|", $data));

    // Regole di validazione sintattica del contenuto del form di registrazione:
    $rules = array(
        'name' => 'required',
        'surname' => 'required',
        'login' => 'required',
        'email' => 'required|email|confirmed',
        //'email_confirmation' => 'required|email|confirmed',
        'pass' => 'required|required|min:6',
        //'passConfirm' => 'required',
        'g-recaptcha-response' => 'required|captcha',

    );

    // Validazione sintattica del form di registrazione:
    $validator = Validator::make($data, $rules);

    /*
     * Se il form di registrazione contiene dati sintatticamente errati, ritorna alla pagina di registrazione
     * passando la lista dei messaggi di errore da visualizzare
     */
    if ($validator->fails()){
        return Redirect::to('/registration')->withInput()->withErrors($validator);
    }

    // Altrimenti se i dati inseriti sono sintatticamente corretti:
    else {

        // Controlla se esiste un utente con la stessa e-mail:
        $resultCheckEmail = DB::select('select * from pm_user where email = ?', [$data['email']]);
        Log::info('blablabla');

        if (empty($resultCheckEmail)) {

        }

        // Controlla se esiste un utente con lo stesso username:
        $resultCheckUsername = DB::select('select * from pm_user where email = ?', [$data['login']]);
        Log::info('blablabla');

        if (empty($resultCheckUsername)) {

        }
    }
}

正如您在这段代码中看到的,我定义了一个 $rules 数组,它定义了提交数据的验证规则,我通过这一行检查这些数据是否有效:

$validator = Validator::make($data, $rules);

如果验证失败,它将返回到注册表单视图,通过以下行传递错误:

return Redirect::to('/registration')->withInput()->withErrors($validator);

如果输入验证正确,它将进入此代码块:

    else {

        // Check if yet exists an user with the same e-mail in the database:
        $resultCheckEmail = DB::select('select * from pm_user where email = ?', [$data['email']]);
        Log::info('blablabla');

        if (empty($resultCheckEmail)) {
            // RETURN TO THE REGISTRATION FORM WITH A SPECIFIC ERROR MESSAGE
        }

        // Check if yet exists an user with the same username in the database:
        $resultCheckUsername = DB::select('select * from pm_user where email = ?', [$data['login']]);
        Log::info('blablabla');

        if (empty($resultCheckUsername)) {
            // RETURN TO THE REGISTRATION FORM WITH A SPECIFIC ERROR MESSAGE
        }
    }

在这里我还必须检查是否存在具有相同电子邮件 and\or 相同用户名的用户(因为我无法注册 2 个具有相同电子邮件 and/or 的用户相同的用户名)。

因此,如果存在具有相同电子邮件 and/or 相同用户名的用户,我必须返回到注册表格页面,并带有特定错误,该错误必须显示在之前的相同位置错误消息,此处:

我认为我必须以某种方式将这些消息放入 $errors 数组。

我该怎么做?处理这种情况更聪明的方法是什么?

您可以将唯一验证规则添加到您的规则中。

'email' => 'required|email|confirmed|unique:yourtablename,yourcolumnname'

有关详细信息,请参阅 https://laravel.com/docs/5.4/validation#rule-unique

而不是

'login' => 'required',
'email' => 'required|email|confirmed',

你应该使用

'login' => 'required|unique:users',
'email' => 'required|email|confirmed|unique:users',

假设您在 table 用户中的字段是登录名,电子邮件是 loginemail。如果不是,您应该按照 documentation

中的说明在后面传递列名

以下规则应该有效

'email' => 'required|email|confirmed|unique:pm_user,email',
'login' => 'required|unique:pm_user,login'