我在 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',
假设您在表用户中的字段是登录,并且电子邮件为login
和email
。如果没有,则应按照文档中的描述
您可以将唯一验证规则添加到规则中。
'电子邮件'=>'必需|电子邮件|已确认|唯一: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'