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

Menerapkan UUID di Laravel

Kamis, 8 Juni 2023
Menerapkan UUID di Laravel

Dalam pembuatan aplikasi, pada dasarnya kita akan menggunakan sebuah id dengan auto incrrement. Namun ada hal yang kendalan yang mungkin akan kita temukan dengan penggunaan id auto increment tersebut.

Permasalahan Dengan ID Auto Increment

Mudah ditebak & diambil datanya

Dalam aplikasi yang menggunakan id atau primary key yang auto increment, biasanya untuk memanggil atau mengakses datanya menggunakan URL seperti ini.

https://kawankoding.com/user?id=7
https://kawankoding.com/user/7

Dengan kondisi seperti ini, pengguna aplikasi kita akan dengan mudah untuk mengenali atau mengakses ID dari seorang user. Mungkin akan ada pengguna yang iseng atau kepo mengubah nilai ID 7 tersebut dengan angka lain. Jika memang halaman tersebut adalah sebuah halaman umum yang memang user diizinkan untuk membukanya maka tidak jadi masalah. Namun jika peruntukan halaman tersebut hanya boleh diakses oleh pengguna yang memiliki ID tersebut maka bisa jadi akan menimbulkan masalah

Semisal ada orang yang ingin mendapatkan data user dari aplikasi kita, maka dengan mudah mereka mengambil data-datanya dengan membuat looping ID user

Tentunya kita bisa cegah hal ini dengan melakukan otorisasi dengan Policy, Middleware atau sesederhana dengan if else. Tapi mungkin kita ingin memberikan keamanan yang lebih agar kendala ID user yang terlihat jelas dan mudah sekali ditebak dengan mengubah primary key dengan menggunakan sebuah UUID.

Masalah Skalabilitas

Kendala berikutnya dari penggunaan primary key yang auto increment. Ketika misalnya kita punya aplikasi yang sudah berjalan di beberapa server, pada kemudian hari ada permintaan untuk menggabungkan aplikasi ke dalam sebuah aplikasi dan satu database.

Maka akan timbul masalah konflik atau bentrok pada ID yang memiliki nilai yang sama, sampai jadi sengketa wkwk. Intinya permasalahan disebabkan oleh data data yang berasal dari beberapa tempat dijadikan satu tapi memiliki ID yang sama, repot ! :D

Masalah lainnya bisa muncul ketika dalam aplikasi yang merekam transaksi, terjadi transaksi yang banyak dan cepat, Semisal dalam 1 detik ada ribuan data baru yang akan masuk ke aplikasi kita, maka auto increment ini kurang efektif.

Menerapkan UUID di Laravel

Dengan mengetahui permasalahan yang bisa timbul tadi maka di sini kita akan implementasikan UUID sebagai solusinya. Masa iya saya tega jelasin permasalahan tapi gak kasih solusinya wkwk.

Nah ngomong ngomong UUID, apasih UUID? Menurut Wikipedia. Secara singkat UUID adalah sebuah string yang terdiri dari 32 karakter. Dibuat secara acak dan kecil kemungkinan menghasilkan nilai yang sama.

Membuat Sendiri Fungsi Generate UUID

Pada Laravel tersedia helper Str untuk membuat UUIDv4. Tapi, UUID kan bukan merupakan primary key dari bawaan Eloquent / Migration. Jadi kita bisa menerapkan secara mandiri, di sini kita pelajari bagaimana menerapkan UUID secara otomatis di Eloquent Model dengan helper Str.

Kita gunakan saja tabel users yang kita dapatkan dari awal kita menginstal Laravel, mari kita ubah ID menjadi UUID. Beginilah bentuk migration tabel users dari bawaan Laravel.

public function up(): void
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('username')->unique();
        $table->string('email')->unique();
        $table->string('avatar')->nullable()->default(null);
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

File migration tersebut akan membuat sebuah primary key dengan tipe big integer dan auto increment, lalu kita bisa sesuaikan seperti ini

public function up(): void
{
    Schema::create('users', function (Blueprint $table) {
        $table->uuid('id')->primary();
        $table->string('name');
        $table->string('username')->unique();
        $table->string('email')->unique();
        $table->string('avatar')->nullable()->default(null);
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

Kemudian jalankan migrationnya, setelah tabel berhasil dibuat selanjutnya kita harus menonaktifkan auto increment melalui model User, tambahkan baris kode berikut ini.

public function getIncrementing()
{
    return false;
}

public function getKeyType()
{
    return 'string';
}

Untuk membuat UUID secara otomatis ketika membuat data baru, kita akan implementasikan model event creatingdimana akan ditrigger ketika membuat sebuah data baru.

use Illuminate\Support\Str;

class User extends Authenticatable
{
    protected static function boot() {
        static::creating(function ($model) {
            if ( ! $model->getKey()) {
                $model->{$model->getKeyName()} = (string) Str::uuid();
            }
        });
    }
}

Begitulah kira-kira untuk membuat UUID dengan cara yang cukup mandiri, lantas cara praktisnya apakah ada? Ada kok, sengaja biar panjang artikelnya :P

Membuat UUID dengan Trait HasUuids

Cara praktis untuk menerapkan UUID di Laravel terbaru bisa menggunakan trait HasUuids, kita cukup tambahkan pada trait yang digunakan pada model yang dituju, contohnya pada model User bawaan ini yang awalnya seperti ini.

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}

Tambahkan trait HasUuids pada baris use.

use Illuminate\Database\Eloquent\Concerns\HasUuids;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, HasUuids;
}

Demikan cara membuat UUID pada Framework Laravel.