UUID مخفف Universal Unique Identifier است. UUID یک شماره 128 بیتی است که برای شناسایی منحصر به فرد یک شی یا در مورد ما، یک رکورد پایگاه داده استفاده می شود.

من نمی خوام UUID رو با Auto Incrementing ID مقایسه کنم، بلکه میخوام نحوه استفاده از UUID در لاراول را به شما آموزش بدهم.

migration خود را آماده کنید

اولین قدم استفاده از UUID در دیتابیس شما، تنظیم ستون شما از یک نوع خاص است. به طور پیش فرض، در هر مایگرشن لاراول که ایجاد می کنید$table->increments('id'); وجود دارد.

برای استفاده UUID کافیه متد ->uuid() را استفاده کنیم. به عنوان مثال، ما میخوایم یک مایگریشن برای پست ها ایجاد کنیم.


Schema::create('posts', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->string('title');
    $table->text('body');
    $table->timestamps();
});

خطی که باید به آن توجه کنید این است:

$table->uuid('id')->primary();

توجه کنید ما به جای استفاده از متد معمول increments() از uuid() استفاده کرده ایم. همانطور که مشاهده می کنید، متد uuid() مشخص می کند که ستون باید یک ستون UUID باشد و ما همچنین مشخص می کنیم که باید کلید اصلی جدول باشد.

ایجاد UUID

اگر php artisan migrate را اجرا کنید و سعی کنید با استفاده از چیزی شبیه factory یا روش معمول یک رکورد جدید ایجاد کنید، با خطایی مواجه می شوید که می گویید ستون ID نمی تواند null باشد.

هنگام استفاده از متد primary() در مایگریشن ها، لاراول متوجه می شود که این یک ستون auto-incrementing است، مقداری برای آن تنظیم می کند. اما از آنجایی که ما UUID استفاده می کنیم، باید خودمان ID را ایجاد کنیم.

از Eloquent Events استفاده کنید

از آنجا که شما از لاراول استفاده می کنید، تصور می کنم شما همچنین می توانید از Eloquent استفاده کنید تا به راحتی با دیتابیس خود ارتباط برقرار کنید.

Eloquent در مدل ها خود چیزی به نام Model Events دارد. در مجموع، 11 Event وجود دارد که هر کدام در سناریو های مختلف مورد استفاده قرار می گیرد.

شما Event های زیر را دارید:

  • retrieved
  • creating
  • created
  • updating
  • updated
  • saving
  • saved
  • deleting
  • deleted
  • restoring
  • restored

اگر می خواهید درباره Eloquent Events اطلاعات بیشتری کسب کنید، می توانید به مستندات مراجعه کنید.

اکنون، به ایجاد UUID ها باز می گردیم. بیاید نگاهی به مدل Post خود بیاندازیم:


class Post extends Model
{
    protected $guarded = []; // YOLO

    protected static function boot()
    {
        parent::boot();

        static::creating(function ($post) {
            $post->{$post->getKeyName()} = (string) Str::uuid();
        });
    }

    public function getIncrementing()
    {
        return false;
    }

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

در مدل ما 3 متد وجود دارد. متد boot جایی است که ما می توانیم در مدل هوک بزنیم و به هر Eloquent Event گوش بدیم. متد getIncrementing زمانی توسط Eloquent استفاده می شود که ما از ‍‍incrementing استفاده می کنیم. به یاد داشته باشید ما از UUID استفاده می کنیم بنابراین ما آن را false تنظیم می کنیم.

در آخر، متد getKeyType فقط مشخص می کند که ID موجود باید بصورت string ذخیره شود.

در متد boot ما، به creating event گوش داده ایم. این event دقیقا قبل از ذخیره شدن رکورد در دیتابیس رخ می دهد. ما به این event هوک میزنیم، و از متد uuid() ارائه شده توسط کلاس Str در لاراول استفاده می کنیم.

در نسخه پیشین لاراول، افراد برای ایجاد UUID لازم بود یک پکیج را با استفاده composer نصب کنند، اما الان می توانید با استفاده از متد uuid() موجود در کلاس Str به راحتی آن را تولید کنید.

به همین راحتی، می توانید از UUID ها در لاراول استفاده کنید.

ما برای اینکه لاجیک بهتری داشته باشیم و تکرار پذیری کد را به حداقل برسانیم، بهتر است یک PHP trait ایجاد کنیم و آن را در هر مدل ای که نیاز داریم از UUID استفاده کنید، آن را صدا میزنیم.

این همان چیزی که UsesUuid trait به نظر می رسد: ‍‍‍

<?php

namespace App\Models\Concerns;

use Illuminate\Support\Str;

trait UsesUuid
{
    protected static function bootUsesUuid()
    {
        static::creating(function ($model) {
            if (! $model->getKey()) {
                $model->{$model->getKeyName()} = (string) Str::uuid();
            }
        });
    }

    public function getIncrementing()
    {
        return false;
    }

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

توجه کنید که چطور همه چیز عمومی شد و شما دیگر نیاز ندارید به یک مدل مراجعه کنید و کدها رو کپی کنید.

الان، در هر مدلی که میخواید ستون ID بصورت UUID باشد، کد شما شبیه کد زیر خواهد بود:

class Post extends Model
{
  use App\Models\Concerns\UsesUuid;

  protected $guarded = []; // YOLO
}

خودشه، فقط در چند مرحله ساده فهمیدیم چطور UUID در برنامه های لاراولی کار می کند.

خب دوستان به آخر مقاله رسیدیم و امیدواریم که این مقاله برای شما مفید واقع شده باشد و فراموش نکنید نظرتتان را با ما به اشتراک بگذارید.

منبع : Dev