[英]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',
假設您在表中的用戶是登錄名,電子郵件是login
和email
。 如果不是,則應按照文檔中的描述在后面傳遞列名
您可以將唯一驗證規則添加到您的規則中。
'電子郵件'=>'必填|電子郵件|確認|唯一:您的表名,您的列名'
有關更多信息,請參見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.