'Laravel registration not working because of hidden fields

I am new to laravel and I have a problem in my registration form.

I have a select dropdown refer here with two options -Faculty and -Student. When the user will chose student the fields grade and section will show while if faculty it will hide the two fields.

But my problem is when I chose the faculty it will not register. Because of the two hidden fields.

Here is my registration.blade.php

<form class="px-3" method="POST" action="{{ route('register') }}">
@csrf

 <div class="form-row">
<div class="form-group col-md-6">
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus placeholder="Name">                                          @error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>

<div class="form-group col-md-6">
<input id="mobile" type="mobile" class="form-control @error('mobile') is-invalid @enderror" name="mobile" value="{{ old('mobile') }}" required autocomplete="mobile" placeholder="Phone Number">                                 @error('mobile')                                           <span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>

<div class="form-group">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" placeholder="Email">                                        @error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>

<div class="form-group">
<input id="password" type="password" class=" form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password" data-toggle="password" placeholder="Password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>

<div class="form-group">
<input id="password-confirm" type="password" class="form-control @error('confirmed') is-invalid @enderror" name="password_confirmation" required autocomplete="current-password" placeholder="Confirm Password" data-toggle="password"  >
</div>

<div class="form-group">
<select class="form-control @error('category')
is-invalid @enderror" name="category" id="category" required>
<option selected disabled>Register As:</option>
<option value="faculty">Faculty</option>
<option value="student">Student</option>
</select>
@error('category')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
 @enderror
</div>

<div class="form-row hidden form-input" id="pDetails">
<div class="form-group col-md-6">
 <select class="form-control @error('uyear') is-invalid @enderror" name="uyear" id="uyear">
<option selected disabled>Year</option>
<option value="First year">First Year</option>
<option value="Second Year">Second Year</option>
<option value="Third Year">Third Year</option>
<option value="Fourth Year">Fourth Year</option>
</select>
@error('uyear')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>

<div class="form-group col-md-6">
<input id="usec" type="text" class=" input form-control @error('usec')is-invalid @enderror" name="usec" placeholder="Section" >
@error('usec')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>

<button class="btn btn-primary btn-user btn-block">Register
</button>
<hr>
</form>

Registration Controller

protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'mobile' => ['required' ,'string' ,'unique:users'],
            'category' => ['required' ,'string'],
            'uyear' => ['required','nullable','string'],
            'usec' => ['required', 'nullable', 'string'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\Models\User
     */


    protected function create(array $data)
    {
        $user = config('roles.models.defaultUser')::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'category' => $data['category'],
        'mobile' => $data['mobile'],
        'uyear' => $data['uyear'],
        'usec' => $data['usec'],
        ]);

        $role = config('roles.models.role')::where('name', '=', 'User')->first();  //choose the default role upon user creation.
        $user->attachRole($role);

        return $user;

    }

    public f

This is the javascript that hide/show the hidden fields

  <script type="text/javascript">
    $('#category').change(function(){
        var responseID = $(this).val();
        if(responseID =="student"){
            $('#pDetails').removeClass("hidden");
            $('#pDetails').addClass("show");
            $( "#uyear" ).prop( "disabled", false );
            $( "#usec" ).prop( "disabled", false );
        } else{
            $('#pDetails').removeClass("show");
            $('#pDetails').addClass("hidden");
            $( "#uyear" ).prop( "disabled", true );
            $( "#usec" ).prop( "disabled", true );
        }
        console.log(responseID);
    });
</script>


Solution 1:[1]

I tested your code, there is problem about validation fails because you declared required in "uyear & usec" field rule. You need to use requiredIf Rule. If condition true then it will check Required otherwise it will ignore required rule

just remove required from uyear & usec field rule. & see below & replace it in your rules instead of required rule.

Rule::requiredIf(function () use ($request) {
     return $request->category === "student";
})

Note:- you need to include use Illuminate\Validation\Rule; class

here if full code of your validation rule. Please check it

public function test(Request $request)
{
    Validator::make($request->all(), [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
        'mobile' => ['required' ,'string', 'unique:users'],
        'category' => ['required' ,'string'],
        'uyear' => [
            Rule::requiredIf(function () use ($request) {
                    return $request->category === "student";
            }),'nullable','string'],
        'usec' => [
            Rule::requiredIf(function () use ($request) {
                return $request->category === "student";
            }), 'nullable', 'string'],
    ])->validate();
}

for More Details abour RequiredIf check here Official Docs

Edited:-

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class RegisterController extends Controller
{
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function create(Request $request)
    {
        Validator::make($request->all(), [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'mobile' => ['required' ,'string'],
            'category' => ['required' ,'string'],
            'uyear' => [
                Rule::requiredIf(function () use ($request) {
                        return $request->category === "student";
                }),'nullable','string'],
            'usec' => [
                Rule::requiredIf(function () use ($request) {
                    return $request->category === "student";
                }), 'nullable', 'string'],
        ])->validate();

        print_r($request->all());
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1