From what I can tell, you are doing the Validator::make passing it the input and calling validate, but then not checking to see if that validation even passed and then you try to use the array to create a user.
In your store request:
$user = $newUser->create($request->only(['name', 'email', 'gender', 'mobile_number', 'password', 'password_confirmation']))->roles()->sync($request->roles);
You are telling it to only include some data, and not passing the fname through, so the array does not have it when you try to use it in your action.
$user = $newUser->create($request->only(['name', 'fname', 'lname', 'email', 'gender', 'mobile_number', 'password', 'password_confirmation']))->roles()->sync($request->roles);
Making it include those keys should fix the issue. But I suggest you check the docs for validation here: https://laravel.com/docs/8.x/validation#manually-creating-validators and make sure you are validating correctly.