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 creating
dimana 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.