Implementasi Passwordless dengan Laravel / Validasi User Email

Silakan buka file login.blade.php yang ada di resources/views/auth/login.blade.php dan silakan masukkan markup berikut ini:

login.blade.php
<x-app-layout>
    <div class="container">
        <div class="rows">
            <div class="col-md-4">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">Login</h5>
                        <form method="post" action="{{ route('login') }}">
                            @csrf
                            <div class="mb-2">
                                <label for="email" class="form-label">Email</label>
                                <input type="email" name="email" id="email" class="form-control">
                            </div>

                            <button type="submit" class="btn btn-primary">
                                Get magic link
                            </button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</x-app-layout>

LoginController

Setelah itu, silakan buka terminal Anda untuk membuat 1 controller dengan nama LoginController seperti:

Terminal
php artisan make:controller Auth/LoginController

Routes

Next, buka file routes/web.php untuk membuat route login seperti berikut:

routes/web.php
use App\Http\Controllers\Auth\LoginController;
use Illuminate\Support\Facades\Route;

Route::get('login', [LoginController::class, 'create'])->name('login');
Route::post('login', [LoginController::class, 'store']);

Setelah itu, Anda bisa buka project ini di browser, http://localhost:8000/login. Dan pastinya Anda akan melihat error seperti:

Method App\Http\Controllers\Auth\LoginController::create does not exist.

Dan itu hal yang wajar, karena kita belum membuat method create. Nah karena kita punya 2 method yaitu create dan store, maka kita akan membuat method sekaligus. Buka file app/Http/Controllers/Auth/LoginController.php dan buat method nya seperti berikut:

LoginController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    public function create()
    {
        return view('auth.login');
    }

    public function store(Request $request)
    {
        //
    }
}

Dan setelah itu, silakan refresh kembali di browser. Dan harusnya tampilannya akan sudah seperti ini:

Login page hellayan.com

Baik setelah itu, silakan buka file LoginController.php kembali untuk membuat aksi login nya. Ada beberapa yang harus kita lakukan disini. Seperti validasi email, memastikan bahwa user nya telah terdaftar, dan juga mengirim email. Kita akan mulai satu persatu disini.

Validasi

Pertama, silakan buat validasinya seperti:

LoginController.php
public function store(Request $request)
{
    $request->validate([
        'email' => ['required', 'email', Rule::exists(User::class, 'email')],
    ]);

    // Sending email
    
    // Flash message
    
    // Redirect
}

Perhatikan kode di atas, ada beberapa class yang harus kita use seperti: Rule, User, dan Request. Silakan import class berikut ini tepat dibawah namespace nya:

LoginController.php
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

Nah, setelah itu. Harusnya jika kita kembali ke browser, dan masukkan email yang belum terdaftar, harusnya akan muncul pesan sesuai validasi kita. Namun sebelum itu, silakan buka dulu login.blade.php untuk memasukkan pesan error nya seperti:

login.blade.php
<input type="email" name="email" id="email" class="form-control">
@error('email')
    <div class="text-danger mt-1">{{ $message }}</div>
@enderror

User Factory

Nanti kita akan buat form untuk pendaftaran user, untuk sekarang, silakan buka tinker di command line, dan silakan buat 1 user dengan user factory dari laravel seperti:

Terminal
php artisan tinker

Dan silakan buat user nya seperti:

Terminal
\App\Models\User::factory()->create();

Jika Anda enter, maka data akan acak, nah untuk data saya kebetulan seperti ini:

Terminal
= App\Models\User {#6269
    name: "Prof. Lyla Lakin MD",
    email: "[email protected]",
    email_verified_at: "2023-05-02 07:47:04",
    #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
    #remember_token: "tyyHOhwuMy",
    updated_at: "2023-05-02 07:47:04",
    created_at: "2023-05-02 07:47:04",
    id: 1,
  }

Dan itu akan berbeda dengan yang Anda punya. Oleh karena itu, saya sendiri akan test dengan email yang saya dapat yaitu: [email protected].