Muhammad Amirul Ihsan
Muhammad Amirul Ihsan Fullstack Developer, Content Creator, suka berbagi pengalaman / pengetahuan lewat tulisan maupun video di kawankoding.com

Membuat Validasi Real Time dengan Laravel Precognition

Sabtu, 1 Juli 2023
Membuat Validasi Real Time dengan Laravel Precognition

Pada Laravel 10 terdapat sebuah fitur baru yang bernama Laravel Precognition yang dimana fitur ini akan membantu kita agar mudah menerapkan validasi secara real time. Dengan Laravel Precognition kita tidak perlu mengimplementasikan rules validasi yang ada di backend ke frontend.

Nah Live Validation / Real Time Validation ini tersedia untuk Vue, Vue & Inertia, React, React & Inertia, Alpine & Blade.

Lalu bagaimana untuk implementasinya ? mari kita coba dengan studi kasus yang bisa kita setup dengan cepat.

Setup Proyek Laravel & Laravel Breeze

Pertama, instal Laravel.

laravel new precognition

Kedua, download Laravel Breeze ke dalam proyek kita.

composer require laravel/breeze --dev

Setelah berhasil download Laravel Breeze, selanjutnya jalankan perintah untuk membuat starter kit, kali ini kita akan gunakan Vue & Inertia.

php artisan breeze:install vue

Jangan lupa buat dan seting database, kemudian jalankan migrationnya.

php artisan migrate

Jalankan aplikasinya.

php artisan serve

Kemudian kita akan coba buka http://localhost:8000/register kemudian daftarkan sebuah email -> log out, lalu kita coba untuk daftar dengan email yang sama.

register

Validasi ini akan muncul ketika kita klik tombol Register, nah mari kita buat supaya validasinya real time.

Implementasi Precognition

Untuk mengimplementasikan Precognition, kita perlu menambahkan sebuah middleware ke dalam route kita. Dalam contoh ini kita akan menggunakan route register pada file routes/auth.php.

use Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests;

Route::post('register', [RegisteredUserController::class, 'store'])
        ->middleware([HandlePrecognitiveRequests::class]);

Kemudian kita perlu menginstal sebuah package untuk Precognition (sesuaikan dengan stack proyeknya).

npm install laravel-precognition-vue-inertia

Setelah itu buat sebuah class Form Request , karena Precognition harus menggunakan class Form Request untuk bisa bekerja.

php artisan make:request UserStoreRequest

Berikutnya, buka app/Http/Controllers/Auth/RegisteredUserController.php pada method store() ubah class Request pada type hint menjadi UserStoreRequest dan hapus validasi yang ada, karena akan kita implementasi pada app/Http/Controllers/Auth/RegisteredUserController.php.

use App\Http\Requests\UserStoreRequest;

public function store(UserStoreRequest $request): RedirectResponse
{
    $user = User::create([
        'name' => $request->name,
        'email' => $request->email,
        'password' => Hash::make($request->password),
    ]);

    event(new Registered($user));

    Auth::login($user);

    return redirect(RouteServiceProvider::HOME);
}

Kemudian pada file app/Http/Requests/UserStoreRequest.php sesuaikan seperti ini.

<?php

namespace App\Http\Requests;

use App\Models\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Password;

class UserStoreRequest 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, \Illuminate\Contracts\Validation\ValidationRule|array|string>
     */
    public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:'.User::class,
            'password' => ['required', 'confirmed', Password::defaults()],
        ];
    }
}

Selanjutnya, kita juga butuh menyesuaikan pada bagian frontend pada file resources/js/Pages/Auth/Register.vue

Pertama ubah penggunaan useForm dari awalnya menggunakan milik Inertia

import { Head, Link, useForm } from "@inertiajs/vue3";

Menjadi seperti ini, menggunakan dari Laravel Precognition.

import { Head, Link } from "@inertiajs/vue3";
import { useForm } from "laravel-precognition-vue-inertia";

Kemudian sesuaikan pada bagian form, karena ada perbedaan dari useForm bawaan Inertia dengan yang dimiliki Precognition.

const form = useForm("post", "/register", {
    name: "",
    email: "",
    password: "",
    password_confirmation: "",
});

Terakhir, tambahkan @change="form.validate('input-name')" pada setiap input yang ingin divalidasi, contoh pada input email.

<TextInput
    id="email"
    type="email"
    class="mt-1 block w-full"
    v-model="form.email"
    required
    autocomplete="username"
    @change="form.validate('email')"
/>

Oh ya jangan lupa untuk build ya supaya update aset-asetnya, untuk development sebaiknya jalankan selalu npm run dev untuk production npm run build.

Lalu coba ulangi mendaftar pada http://localhost:8000/register, dan sekarang validasinya akan muncul ketika berpindah input.

register

Sekian, semoga bermanfaat !