Tanggal :15 Juli 2020
Menggunakan UUID di Laravel

Menggunakan UUID di Laravel

Assalamualaikum Warohmatulloh Wabarokatuh, dalam pembuatan aplikasi kadang kita membutuhkan sesuai yang lebih dari sebuah id auto increment integer untuk sebuah primary key. Ada beberapa masalah yang mungkin akan kita temukan dengan penggunaan id auto increment integer tersebut. Solusinya kita bisa menggunakan UUID. Sebelum kita menggunakan UUID di Laravel ada baiknya kita ketahui masalah yang mungkin timbul dengan penggunaan id auto increment integer.

Permasalahan dengan Auto Increment

Mudah Ditebak & Diambil Datanya

Biasanya dalam pembuatan aplikasi kita seringkali membuat Auto Increment Integer sebagai Primary Key dalam tabel. Yang kemudian biasanya kita akan panggil datanya menggunakan URL yang seperti ini.

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

Dengan kasus seperti itu, pengguna aplikasi kita bisa dengan mudah mengenali ID dari user. Mungkin ada pengguna yang kepo dan mengakses ID user lain dengan mengubah nilai 28 tersebut dengan angka lain. Jika halaman tersebut memang diperuntukkan untuk diakses oleh pengguna maka tidak akan ada masalah. Tapi jika halaman tersebut misalnya hanya boleh diakses oleh pengguna yang memiliki ID tersebut maka ini jadi masalah.

Misalnya ada orang yang ingin mengambil data pengguna dari aplikasi kita, maka mereka akan dengan mudah mengambil data-data dari pengguna kita dengan menbuat looping ID user.

Solusinya tentu kita bisa melakukan pengecekan dengan Policy, Middleware atau sesederhana if else pada Controller misalnya. Tapi mungkin saja kita butuh juga mencegahnya hingga level tebakan tadi, kita bisa tangani dengan mengubah primary key yang kita gunakan dengan UUID.

Masalah Skalabilitas

Permasalahan berikutnya adalah ketika kita memiliki aplikasi yang sudah berjalan di beberapa server. Di kemudian hari ada permintaan untuk menggabungkan aplikasi ini ke dalam sebuah aplikasi dan sebuah database saja.

Timbullah permasalahan Primary Key yang konfik sampai bacok-bacokan karena memiliki id yang sama dan saling klaim wkwkw. Intinya permasalahannya timbul karena data dari beberapa tempat dijadikan satu tapi id mereka sama.

Masalah lain bisa muncul ketika dalam aplikasi kita terjadi transaksi data yang sangat banyak dan cepat. Semisal dalam satu detik ada ribuan data baru yang masuk ke aplikasi kita, maka fungsi auto increment kurang efektif.

Menggunakan UUID di Laravel

Setelah mengetahui permasalahan permasalahan tadi maka di sini kita akan coba implementasikan solusinya. Nggak tega saya kalo cuma kasih masalah tanpa solusi wkwk.

Solusi yang akan kita gunakan adalah dengan menggunakan UUID. Apa itu UUID? Jika kita baca di Wikipedia. Secara singkat UUID adalah sebuah string yang teridi dari 32 karakter. Dibuat secara acak dan kecil kemungkinan menghasilkan nilai yang sama.

Di Laravel tedapat helper Str untuk membuat UUIDv4. Tapii, UUID kan bukan primary key bawaan di Eloquent. Jadi kita harus mandiri dan menerapkannya sendiri. Di sini kita akan belajar bagaimana membuat UUID secara otomatis di Eloquent dengan bantuan helper Str.

Anggaplah kita memulai sebuah proyek baru. Kita akan mengubah ID dari tabel users menjadi sebuah UUID. Secara bawaan file migrationnya seperti ini.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

File migration di atas akan membuat sebuah ID dengan auto increment big integer. Kemudian kita bisa mengubahnya menjadi seperti di bawha ini.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->uuid('id')->primary();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Setelah itu jalankan migrationnya. Setelah tabel dibuat sekarang kita harus menonaktifkan auto increment melalui model User.

/**
     * Get the value indicating whether the IDs are incrementing.
     *
     * @return bool
     */
    public function getIncrementing()
    {
        return false;
    }

    /**
     * Get the auto-incrementing key type.
     *
     * @return string
     */
    public function getKeyType()
    {
        return 'string';
    }

Kemudian untuk membuat UUID secara otomatis ketika menambahkan data. Kita akan gunakan Model Event creating. Kemudian untuk membuat UUID kita gunakan helper Str. Kurang lebih seperti ini kodenya.

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Str;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The "booting" function of model
     *
     * @return void
     */
    protected static function boot() {
        static::creating(function ($model) {
            if ( ! $model->getKey()) {
                $model->{$model->getKeyName()} = (string) Str::uuid();
            }
        });
    }

     /**
     * Get the value indicating whether the IDs are incrementing.
     *
     * @return bool
     */
    public function getIncrementing()
    {
        return false;
    }

    /**
     * Get the auto-incrementing key type.
     *
     * @return string
     */
    public function getKeyType()
    {
        return 'string';
    }

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

Sekian artikel tentang menggunakan UUID di Laravel. Semoga ada manfaat yang bisa diambil. Jika ingin dapat amalan baik dari manfaat tulisan ini. Bantu Sebarkan !.

Assalamualaikum Warohmatulloh Wabarokatuh.

Hi Saya Amirul, Saya mengajarkan koding melalui screencast di Kawan Koding, saya juga menulis Artikel di Kawan Koding.

2 Comments

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *