В Laravel, как проверить все поля ввода, отобразить сообщения об ошибках, если таковые имеются, и вернуться обратно в форму с входными данными, если есть ошибки

#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') — это правильный способ доступа к этим значениям после перенаправления 🙂