Your Guide to Laravel Excellence

Laravel custom login and register Tutorial

Laravel custom login and register Tutorial

This guide will help you set up custom login and registration functionality in Laravel. We'll create a fully functional authentication system using Laravel's powerful features, focusing on custom user login and registration forms. This tutorial is beginner-friendly and assumes that you already have a fresh Laravel project connected to your database.

Views Setup

We will create the views for login, registration, and a simple home page. Create the Layout File Create a layout file at resources/views/index.blade.php:

		<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta
            name="viewport"
            content="width=device-width, initial-scale=1, shrink-to-fit=no"
        />
        <meta http-equiv="x-ua-compatible" content="ie=edge" />
        <title>Login - Laravel 11</title>
        <link
            href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
            rel="stylesheet"
            integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN"
            crossorigin="anonymous"
        />
    </head>

    <body>
        @yield('content')

        <script
            src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
            integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r"
            crossorigin="anonymous"
        ></script>

        <script
            src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js"
            integrity="sha384-BBtl+eGJRgqQAUMxJ7pMwbEyER4l1g+O15P+16Ep7Q9Q+zqX6gSbd85u4mG4QzX+"
            crossorigin="anonymous"
        ></script>
    </body>
</html>

Login Page

Create the Login View Create a login view at resources/views/login.blade.php:



@extends('index')
@section('content')

    <div class="h-100 d-flex align-items-center justify-content-center" style="height: 100vh!important;">
        <main class="form-signin w-25 m-auto bg-body-tertiary p-5" style="width: 60vh!important;">
            <form action="{{ route('login.authenticate') }}" method="POST">
                @csrf
                <h1 class="h3 mb-3 fw-normal">Please sign in</h1>
                @if (Session::has('error'))
                    <div class="message mb-2 text-danger">{{ Session::get('error') }}</div>
                @endif
                <div class="form-floating mb-3">
                    <input type="email" name="email" class="form-control @error('email') is-invalid @enderror"
                        id="email" placeholder="email">
                    <label for="email">Email address</label>
                    @error('email')
                        <div class="message mb-2 text-danger">{{ $message }}</div>
                    @enderror
                </div>
                <div class="form-floating mb-3">
                    <input type="password" name="password" class="form-control @error('password') is-invalid @enderror"
                        id="password" placeholder="password">
                    <label for="password">Password</label>
                    @error('password')
                        <div class="message mb-2 text-danger">{{ $message }}</div>
                    @enderror
                </div>
                <div class="form-check text-start my-3">
                    <input class="form-check-input" type="checkbox" value="remember-me" id="flexCheckDefault">
                    <label class="form-check-label" for="flexCheckDefault">
                        Remember me
                    </label>
                </div>
                <button class="btn btn-primary w-100 py-2" type="submit">{{ __('Sign in') }}</button>
                <p class="text-center my-4">OR</p>
                <a href="{{ route('register') }}" class="btn btn-primary py-2 w-100">{{ __('Sign up') }}</a>
            </form>
        </main>
    </div>
    

Registration View

Create the Registration View Create a registration view at resources/views/register.blade.php:

@extends('index')

@section('content')

    <div class="h-100 d-flex align-items-center justify-content-center" style="height: 100vh!important;">
        <main class="form-signin m-auto bg-body-tertiary p-5" style="width: 60vh!important;">
            <form action="{{ route('register.authenticate') }}" method="POST">
                @csrf
                <h1 class="h3 mb-3 fw-normal">Please sign up</h1>
                <div class="form-floating mb-3">
                    <input type="text" name="name" class="form-control @error('name') is-invalid @enderror"
                        id="name" placeholder="name">
                    <label for="name">Name</label>
                    @error('name')
                        <div class="message mb-2 text-danger">{{ $message }}</div>
                    @enderror
                </div>
                <div class="form-floating mb-3">
                    <input type="email" name="email" class="form-control @error('email') is-invalid @enderror"
                        id="email" placeholder="email">
                    <label for="email">Email address</label>
                    @error('email')
                        <div class="message mb-2 text-danger">{{ $message }}</div>
                    @enderror
                </div>
                <div class="form-floating mb-3">
                    <input type="password" name="password" class="form-control @error('password') is-invalid @enderror"
                        id="password" placeholder="password">
                    <label for="password">Password</label>
                    @error('password')
                        <div class="message mb-2 text-danger">{{ $message }}</div>
                    @enderror
                </div>
                <button class="btn btn-primary w-100 py-2" type="submit">{{ __('Sign up') }}</button>
                <p class="text-center my-4">OR</p>
                <a href="{{ route('login') }}" class="btn btn-primary py-2 w-100">{{ __('Sign in') }}</a>
            </form>
        </main>
    </div>

@endsection

Creating Controller

php artisan make:controller LoginController

php artisan make:controller RegisterController

Routes Setup

Define the routes for these controllers in routes/web.php:

Route::middleware('guest')->group(function () {

    Route::get('/login', [LoginController::class, 'login'])->name('login');
    Route::get('/register', [RegisterController::class, 'register'])->name('register');
    Route::post('/login/authenticate', [LoginController::class, 'authenticate'])->name('login.authenticate');
    Route::post('/register/authenticate', [RegisterController::class, 'store'])->name('register.authenticate');

});

Route::middleware('auth')->group(function () {

    Route::view('/home', 'home')->name('home');
    Route::get('/logout',  [LogoutController::class, 'logout'])->name('logout');

});

Controller Setup

Now lets finalize our code, goto your controllers. Goto your App\Http\Controllers\RegisterController

public function register()
{
    return view('register');
}

public function store(Request $request)
{
    $request->validate([
        'name' => ['required', 'string', 'min:3', 'max:255'],
        'email' => ['required', 'email', 'max:255', 'unique:users,email'],
        'password' => ['required', 'min:6']
    ]);

    $user = User::create([
        'name' => $request->name,
        'email' =>  $request->email,
        'password' =>  Hash::make($request->password),
    ]);
    Auth::login($user);
    return redirect()->route('home');
}

Goto your App\Http\Controllers\LoginController

public function login()
{
    return view('login');
}

public function authenticate(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required',
        'password' => 'required',
    ]);

    $authenticated = Auth::attempt($credentials);
    if (!$authenticated) {
        Session::flash('error', "Credentials does not match our record.");
        return Redirect::back();
    } else {
        return redirect()->route('home');
    }
}

Goto your App\Http\Controllers\LogoutController

public function logout()
{
    Session::flush();
    Auth::logout();
    return redirect()->route('login');
}

Recommeded Posts

AWS Elastic Transcoder: Convert & Stream Videos in Laravel 11

AWS Elastic Transcoder: Convert & Stream Videos in Laravel 11

AWS Elastic Transcoder: Convert & Stream Videos in Laravel 11

1 month ago Read article →
How to Prevent Spam in Laravel Forms with spatie/laravel-honeypot

How to Prevent Spam in Laravel Forms with spatie/laravel-honeypot

How to Prevent Spam in Laravel Forms with spatie/laravel-honeypot

1 month ago Read article →
How to Add Real-Time Comments in Laravel 11 with Laravel Reverb

How to Add Real-Time Comments in Laravel 11 with Laravel Reverb

How to Add Real-Time Comments in Laravel 11 with Laravel Reverb

1 month ago Read article →
CRUD with Alpine.js, Tailwind CSS, and jQuery DataTable Modals

CRUD with Alpine.js, Tailwind CSS, and jQuery DataTable Modals

Learn how to build a full CRUD system using Alpine.js, Tailwind CSS, and jQuery DataTable, complete with modals for better user experience.

1 month ago Read article →