如何在 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 用户中的字段是登录名,电子邮件是 login
和 email
。如果不是,您应该按照 documentation
中的说明在后面传递列名
以下规则应该有效
'email' => 'required|email|confirmed|unique:pm_user,email',
'login' => 'required|unique:pm_user,login'
我是 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 用户中的字段是登录名,电子邮件是 login
和 email
。如果不是,您应该按照 documentation
以下规则应该有效
'email' => 'required|email|confirmed|unique:pm_user,email',
'login' => 'required|unique:pm_user,login'