#php #laravel
#php #laravel
Вопрос:
Я пытаюсь проверить регистрационную форму пользователя с помощью Laravel Validator::make
. Код работает, включая отображение сообщений об ошибках в соответствующих полях. Но мои проблемы :-
1) Независимо от того, что я ввожу в поле электронной почты, оно всегда выдает ошибку. Таким образом, он не перенаправляет меня на следующую страницу, даже если я ввожу правильный формат example@example.com . Я попытался удалить средство проверки «электронной почты» и попробовал. Он по-прежнему показывает мне сообщение «требуется поле электронной почты»
2) В дополнение к этому, если в одном или нескольких полях есть какие-либо ошибки, страница перенаправляется обратно, но поля ввода не заполняются прошлым вводом.
Вот страница контроллера
public function showdata(Request $request){
$first_name = $request->first_name;
$last_name = $request->last_name;
$email = $request->eid;
$password = $request->password;
$confirm_password = $request->confirm_password;
$mobno = $request->mobno;
$dob = $request->dob;
$gender = $request->gender;
$address = $request->address;
$country = $request->country;
$time = $request->dt;
$messages=
[
'required' => "The :attribute field is required",
'email.email' => "The :attribute :input format should be example@example.com/.in/.edu/.org....",
'email.unique' => "The :attribute :input is taken. Please use another email address",
'confirm_password.same' => "Password and Confirm password fields must match exactly",
'mobno.digits' => "The :attribute field accepts only numbers",
'mobno.digits:10' => "The :attribute should be 10 digits long",
'dob.date_format' => "The date format :input should be YYYY-MM-DD",
'address.string' => "The :attribute :input must be in the form of a string"
];
$rules = [
'first_name' => 'required',
'last_name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:8',
'confirm_password' => 'required|min:8|same:password',
'mobno' => 'required|digits:10',
'dob' => 'required|date|date_format:Y-m-d',
'gender' => 'required',
'address' => 'required|string',
'country' => 'required'
];
$validate = Validator::make($request->all(),$rules,$messages);
if($validate->fails()){
return back()->withInput()->withErrors($validate->messages());
}
else{
return view('recheck_form')
->with('first_name',$first_name)
->with('last_name',$last_name)
->with('email',$email)
->with('password',$password)
->with('mobno',$mobno)
->with('dob',$dob)
->with('gender',$gender)
->with('address',$address)
->with('country',$country)
->with('time',$time);
}
}
}
И блейд-страница
<div class="container pt-2">
<div class="row shadow p-3 mb-5 bg-info rounded text-center text-white">
<div class="col ">
<h2>New User Registration</h2>
</div>
</div>
</div>
<div class="row m-5 p-5 bg-light text-info">
<div class="col">
<form class="form-group" method="post" action="recheck-form" autocomplete="off">
<div class="form-group {{ $errors->has('first_name') ? ' has-error' : '' }}">
@csrf
<label for="fname">First Name:</label>
<input type="text" class="form-control" name="first_name">
<small class="text-danger">{{$errors->first('first_name') }}</small>
</div>
<div class="form-group {{ $errors->has('last_name') ? ' has-error' : '' }}">
<label for="lname">Last Name:</label>
<input type="text" class="form-control" name="last_name">
<small class="text-danger">{{ $errors->first('last_name') }}</small>
</div>
<div class="form-group {{ $errors->has('email') ? ' has-error' : '' }}">
<label for="eid">Email/Username:</label>
<input type="text" class="form-control" name="eid">
<small class="text-danger">{{ $errors->first('email') }}</small>
</div>
<div class="form-group {{ $errors->has('password') ? ' has-error' : '' }}">
<label for="pwd">Password:</label>
<input type="password" class="form-control" name="password">
<small class="text-danger">{{$errors->first('password') }}</small>
</div>
<div class="form-group {{ $errors->has('confirm_password') ? ' has-error' : '' }}">
<label for="confpwd">Confirm Password:</label>
<input type="password" class="form-control" name="confirm_password">
<small class="text-danger">{{ $errors->first('confirm_password') }}</small>
</div>
<div class="form-group {{ $errors->has('mobno') ? ' has-error' : '' }}">
<label for="mobno">Mobile Number:</label>
<input type="text" class="form-control" name="mobno">
<small class="text-danger">{{ $errors->first('mobno') }}</small>
</div>
<div class="form-group {{ $errors->has('dob') ? ' has-error' : '' }}">
<label for="dob">Date of Birth(in YYYY-MM-DD):</label>
<input type="text" class="form-control" name="dob">
<small class="text-danger">{{ $errors->first('dob') }}</small>
</div>
<div class="form-group {{ $errors->has('gender') ? ' has-error' : '' }}">
<label for="gender">Gender:</label>
<br>
amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;
<input class="form-check-input" type="radio" name="gender" id="Female" value="Female">
<label class="form-check-label" for="Female">
Female
</label>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;
<input class="form-check-input" type="radio" name="gender" id="Male" value="Male">
<label class="form-check-label" for="Male">
Male
</label>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;
<input class="form-check-input " type="radio" name="gender" id="Other" value="Other">
<label class="form-check-label" for="Other">
Other
</label>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;
<small class="text-danger">{{ $errors->first('gender') }}</small>
</div>
<div class="form-group {{ $errors->has('address') ? ' has-error' : '' }}">
<label for="address">Address:</label>
<textarea class="form-control" rows="5" name="address"></textarea>
<small class="text-danger">{{ $errors->first('address') }}</small>
</div>
<div class="form-group {{ $errors->has('country') ? ' has-error' : '' }}">
<label for="country">Country:</label>
<select name="country" class="form-control" id="countrylist">
<option value disabled selected>Select Country</option>
@foreach($countryname as $key => $country)
<option id="countryname" value="{{$country->countryname}}">{{$country->countryname}}</option>
@endforeach
</select>
<small class="text-danger">{{ $errors->first('country') }}</small>
</div>
<div class="form-group">
<label for="dt">Date and Time of Submission:</label>
<input type="text" class="form-control" name="dt" readonly value=@php date_default_timezone_set("Asia/Kolkata"); echo date("Y-m-d,H:i:s ") @endphp>
</div>
<div class="form-group text-center">
<input type="submit" class="btn btn-primary mb-2">
</div>
Я не знаю, как загружать изображения в вопросы о переполнении стека. Если вы можете сказать мне, я могу показать вам точную проблему с помощью изображений.
Комментарии:
1. Я бы ожидал
name="eid"
name="email"
, что это будет то, что'email' => 'required|email|unique:users'
будет искать правило. Можете ли вы попробовать обновить это$email = $request->email;
, а также повторить попытку?2. В качестве альтернативы, вы могли бы изменить правило на
'eid' => 'required|email|unique:users'
, а код шаблона на$errors->has('eid')
и$errors->first('eid')
, но мне это кажется странным именованием.3. eid=»email / userid» Изменение с «eid» на «email» сработало в прошлый раз, когда я пытался. Но я все еще не понимаю, что было не так с «eid». Кроме того, если есть какие-либо сообщения об ошибках, они отображаются, но поля inpur не содержат предыдущих данных
4. вы можете добавить скриншот, нажав на опцию изображения в редакторе.
5. @Asish добавил ответ ниже с приведенным выше и подробностями для отображения предыдущего значения при перенаправлении ошибки
Ответ №1:
Прежде всего, вы делаете неправильно в своем коде. В правилах проверки и массиве сообщений вы написали неправильно.
Пожалуйста, проверьте приведенный ниже код, он решит вашу проблему.
$messages=
[
'eid.required' => "The :attribute field is required",
'eid.email' => "The :attribute :input format should be example@example.com/.in/.edu/.org....",
'eid.unique' => "The :attribute :input is taken. Please use another email address",
'confirm_password.same' => "Password and Confirm password fields must match exactly",
'mobno.digits' => "The :attribute field accepts only numbers",
'mobno.digits:10' => "The :attribute should be 10 digits long",
'dob.date_format' => "The date format :input should be YYYY-MM-DD",
'address.string' => "The :attribute :input must be in the form of a string"
];
$rules = [
'first_name' => 'required',
'last_name' => 'required',
'eid' => 'required|email|unique:users',
'password' => 'required|min:8',
'confirm_password' => 'required|min:8|same:password',
'mobno' => 'required|digits:10',
'dob' => 'required|date|date_format:Y-m-d',
'gender' => 'required',
'address' => 'required|string',
'country' => 'required'
];
Страница перенаправляется обратно, но поля ввода не заполняются прошлым вводом.
Для решения этой проблемы вы можете попробовать следующий подход, который определенно сработает
$validate = Validator::make($request->all(),$rules,$messages);
if($validate->fails()){
return redirect()->back()->withErrors($validate->messages())->withInput();
}
И в вашем атрибуте входного значения, пожалуйста, напишите следующее значение =»{{ old(‘name’) }}»
<input type="text" name="name" value="{{ old('name') }}" />
<input type="email" name="email" value="{{ old('email') }}" />
<input type="text" name="first_name" value="{{ old('first_name') }}" />
Комментарии:
1. ДА. Это сработало. Спасибо. Но, раз уж вы здесь, можете ли вы сказать мне, как убедиться, что входные данные формы сохраняют свои старые данные, если я нажму на кнопку «Назад»?
2. Вам нужно снова перенаправить на этот же контроллер и метод при нажатии кнопки «Назад»
3. @Asish, пожалуйста, скажите мне, почему этот ответ не принимается вами как лучший.
Ответ №2:
Имена вашего поля и правила не совпадают. пожалуйста, обновите
"name="eid"
чтобы быть name="email"
таким, как это 'email' => 'required|email|unique:users'
будет искать правило.
Затем также обновите $email = $request->email;
Для того, чтобы сбросить ранее введенные значения после повторной ошибки, пожалуйста, обновите свой вид следующим образом:
В поле зрения:
<input type="text" class="form-control" name="email" value="{{ old('email') }}">
Примечание,
Если вы хотите сохранить его как eid
, это тоже хорошо, вам просто нужно убедиться, что все использует eid
, т.Е.:
<div class="form-group {{ $errors->has('eid') ? ' has-error' : '' }}">
<label for="eid">Email/Username:</label>
<input type="text" class="form-control" name="eid" value="{{ old('eid') }}">
<small class="text-danger">{{ $errors->first('eid') }}</small>
</div>
$email = $request->eid;
'eid.email' => "The :attribute :input format should be example@example.com/.in/.edu/.org....",
'eid.unique' => "The :attribute :input is taken. Please use another email address",
'eid' => 'required|email|unique:users',
Комментарии:
1. Первая часть была выполнена. Но я все еще получаю пустые поля ввода (после перенаправления с сообщениями об ошибках) даже после обновленного кода
2. @Asish использовать
old('email')
3. @AlzafanChristian ах, хороший улов, я рассматривал это как визуализацию представления, а не перенаправление 🙂
4. @Wesley Smith Не могли бы вы объяснить, что это такое (просмотр рендеринга и т.д.) Я в основном новичок в Laravel.
5. @Asish Игнорирует, что в предыдущей версии моего ответа предлагалось отправлять данные в представление, как показано здесь , но я забыл, что в случае ошибки в вашем коде используется перенаправление, например
back()->withInput()
, Alzafan указал на мою ошибку и что использованиеold('email')
— это правильный способ доступа к этим значениям после перенаправления 🙂