簡體   English   中英

如何在Laravel中執行此自定義輸入表單驗證(如果用戶名\\電子郵件尚未存在於DB中)?

[英]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

如您在前面的代碼中所看到的,此視圖包含此部分,該部分對可能的“語法”錯誤進行迭代,如果輸入未通過驗證,則在此頁面中顯示該部分:

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

在這里,我還必須檢查是否存在具有相同電子郵件和/或相同用戶名的用戶(因為我無法注冊2個具有相同電子郵件和/或相同用戶名的用戶)。

因此,如果存在具有相同電子郵件和/或相同用戶名的用戶,則我必須返回注冊表單頁面並遇到特定錯誤,該錯誤必須顯示在上一個錯誤消息的相同位置,此處:

我認為我必須以某種方式將這些消息放入$ errors數組中。

我該怎么做? 有什么更聰明的方法來處理這種情況?

代替

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

你應該使用

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

假設您在表中的用戶是登錄名,電子郵件是loginemail 如果不是,則應按照文檔中的描述在后面傳遞列名

您可以將唯一驗證規則添加到您的規則中。

'電子郵件'=>'必填|電子郵件|確認|唯一:您的表名,您的列名'

有關更多信息,請參見https://laravel.com/docs/5.4/validation#rule-unique

以下規則應該有效

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM