我如何在Laravel中执行此自定义输入表单验证(如果在DB中存在的用户名电子邮件)



我在 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

您可以在上一个代码中看到此视图包含此部分,该部分将在可能的"语法"错误上迭代并在此页面中显示,如果未验证输入:

        @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)) {
        }
    }
}

您可以在此代码中看到,我定义了A $规则数组定义提交数据的验证规则,并且我检查这些数据是否有效为止:

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

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

因此,如果存在具有相同电子邮件和/或相同用户名的用户,我必须回到注册表单页面,其中具有特定错误,必须在上一个错误消息的同一位置显示,:

我认为我必须以某种方式将这些消息放入 $错误 array。

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

而不是

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

您应该使用

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

假设您在表用户中的字段是登录,并且电子邮件为loginemail。如果没有,则应按照文档中的描述

传递列名。

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

'电子邮件'=>'必需|电子邮件|已确认|唯一:yourtableName,yourcolumnname'

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

以下规则应起作用

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