feat(registration): User registration

- add validation, and prepare the model.
- show errors in form components
- refactor route file to make register route as resource
This commit is contained in:
kusowl 2026-01-09 14:00:42 +05:30
parent 372610065d
commit ec7ae434c4
10 changed files with 81 additions and 7 deletions

View File

@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers;
use App\Enums\UserStatus;
use App\Enums\UserTypes;
use App\Http\Requests\StoreRegisterdUser;
use App\Models\User;
use Illuminate\Http\Request;
class RegisteredUserController extends Controller
{
public function create()
{
return view('auth.register');
}
public function store(StoreRegisterdUser $request){
$data = $request->validated();
$status = UserStatus::Active->value;
if ($request->role === UserTypes::Broker){
$status = UserStatus::Pending->value;
}
$data['status'] = $status;
User::create($data);
return to_route('login')->with('success', 'User registered successfully.');
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace App\Http\Requests;
use App\Enums\UserTypes;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Password;
class StoreRegisterdUser extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string|max:255',
'password' => ['required', 'confirmed', Password::min(8)->letters()->mixedCase()->numbers()->symbols()],
'email' => 'required|string|email|max:255|unique:users',
'role' => ['required', Rule::in(UserTypes::values()), Rule::notIn(UserTypes::Admin->value)],
];
}
}

View File

@ -21,6 +21,8 @@ class User extends Authenticatable
'name',
'email',
'password',
'status',
'role',
];
/**

View File

@ -26,7 +26,7 @@
</form>
<p class="text-center text-accent-600 text-xs">Don't have an account?
<a href="{{route('register')}}" class="text-blue-500 font-bold">Sign Up</a>
<a href="{{route('register.create')}}" class="text-blue-500 font-bold">Sign Up</a>
</p>
</x-card>
</section>

View File

@ -19,10 +19,11 @@ class="bg-linear-135 flex-1 overflow-y-scroll wrapper py-12 from-[#EFF6FF] to-[#
<p class=" text-accent-600 text-sm">Join {{config('app.name')}} and start discovering great
deals</p>
</div>
<form action="" class="flex flex-col space-y-5">
<form action="{{route('register.store')}}" method="post" class="flex flex-col space-y-5">
@csrf
<x-input label="Full Name" name="name" placeholder="Jhon Doe"/>
<x-input label="Email" name="email" type="email" placeholder="you@example.com"/>
<x-select :options="$options" value-key="value" label-key="label" label="Account Type"/>
<x-select name="role" :options="$options" value-key="value" label-key="label" label="Account Type"/>
<x-input label="Password" name="password" type="password"/>
<x-input label="Confirm Password" name="password_confirmation" type="password"/>

View File

@ -0,0 +1,4 @@
@props(['name' => ''])
@error($name)
<span class="text-xs text-red-500">{{ $message }}</span>
@enderror

View File

@ -6,5 +6,5 @@
@endif
<input class="bg-[#F3F3F5] py-2 px-4 rounded-lg" type="{{$type}}" placeholder="{{$placeholder}}"
name="{{$name}}">
<x-inline-error :name="$name" />
</div>

View File

@ -16,7 +16,7 @@
<div class="nav-buttons space-x-4 font-medium hidden md:block ">
<a href="{{route('login')}}">Login</a>
<a href="{{route('register')}}" class="ui-btn ui-btn-neutral">Register</a>
<a href="{{route('register.create')}}" class="ui-btn ui-btn-neutral">Register</a>
</div>
<!-- mobile menu btn-->
@ -41,7 +41,7 @@
<x-nav-links :link="route('home')" name="About"/>
<x-nav-links :link="route('home')" name="Contact"/>
<a href="{{route('login')}}">Login</a>
<a href="{{route('register')}}" class="ui-btn ui-btn-neutral w-fit">Register</a>
<a href="{{route('register.create')}}" class="ui-btn ui-btn-neutral w-fit">Register</a>
</ul>
</div>
</div>

View File

@ -10,3 +10,4 @@
<option value="{{$option[$valueKey]}}"> {{$option[$labelKey]}} </option>
@endforeach
</select>
<x-inline-error :name="$name" />

View File

@ -1,10 +1,11 @@
<?php
use App\Http\Controllers\HomeController;
use App\Http\Controllers\RegisteredUserController;
use Illuminate\Support\Facades\Route;
Route::get('/', HomeController::class)->name('home');
Route::view('/login', 'auth.login')->name('login');
Route::view('/register', 'auth.register')->name('register');
Route::resource('/register', RegisteredUserController::class)->only(['create', 'store']);