Рубрики
Uncategorized

Красноречивые UUIDs.

Узнайте, как и почему вы должны использовать UUID для своих моделей Eloquent. Помеченный laravel, uuid, php.

В этом уроке я собираюсь показать вам, как и зачем использовать uuid s в качестве ваших первичных ключей в ваших красноречивых моделях.

Что такое UUID?

Uuid (Уникальный универсальный идентификатор) – это 128-битное число, используемое для идентификации информации в Интернете. В зависимости от конкретных используемых механизмов, UUID либо гарантированно будет отличаться, либо, по крайней мере, с высокой вероятностью будет отличаться от любого другого UUID, сгенерированного до 3400 года н.э. (это означает, что в течение более чем следующей тысячи лет крайне маловероятно, что один и тот же UUID будет сгенерирован снова независимо от используемого механизма).

Поэтому идентификаторы UUID важны именно из-за их уникальности.

Почему мы должны использовать UUID?

  • Идентификаторы UUID не раскрывают информацию о записях вашей базы данных, поэтому безопаснее использовать их в общедоступном URL-адресе. Например, видя /пользователей/12/ в URL-адресе настоятельно рекомендуется, чтобы пользователь с идентификатором 11 существовал, что значительно увеличивает вероятность атаки.
  • Они уникальны для всех таблиц, баз данных и серверов, и поэтому миграция из одной базы данных в другую невероятно проста.
  • Идентификаторы UUID генерируются в любом месте, и поэтому вы можете узнать уникальный идентификатор следующей записи базы данных, не обязательно попадая в свою базу данных.

Интеграция UUID в ваши красноречивые модели.

Мы начнем с установки нового приложения laravel.

    laravel new eloquent-uuids

Генерация идентификаторов UUID

Первое, что мы сделаем, это настроим способ генерации UUID. Первым вариантом было бы использовать внешний пакет, который делает это за нас, и я буду рекомендовать этот пакет .Лично я предпочел бы просто иметь пользовательскую функцию, которая делает это, поэтому из документации PHP , мы получим функцию , которая генерирует UUID для нас.

Теперь, где мы разместим этот файл в нашем приложении laravel? Я создам новый файл в /app/Helpers/uuid.php , и я помещу в него эту функцию.

Затем я автоматически загружу этот файл с помощью composer, чтобы эта функция была глобально доступна в моем приложении laravel.

// composer.json
...
    "autoload": {
        "files": [
            "App/Helpers/uuid.php"
        ]
    }
...

Отключение системы первичных ключей по умолчанию в laravel

Чтобы отключить работу первичных ключей по умолчанию:

  • Замените поле приращения для идентификатора строковым полем.
// database\migrations\create_users_table.php
Schema::create('users', function (Blueprint $table) {
  $table->string('id');
  $table->string('name');
  $table->string('email')->unique();
  $table->string('password');
  $table->rememberToken();
  $table->timestamps();
});

  • Установите для свойства увеличение в модели значение false :
// App\User.php

    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;

Регистрация красноречивого крючка для создания

В модели мы зарегистрируем хук creating , который laravel выполнит перед выполнением запроса к базе данных для сохранения записи.

// App\User.php

/**
 * Boot the Model.
 */
 public static function boot()
 {
    parent::boot();

    static::creating(function ($instance) {
       $instance->id = uuid4();
    });
 }

Вот и все! В любое время, когда мы создаем новую запись в базе данных Пользователь модель, для нее генерируется UUID и автоматически сохраняется в базе данных.

Чтобы проверить это, я добавил простой маршрут, чтобы создать пользователя и вернуть вновь созданного пользователя.

// routes/web.php

Route::get('/', function () {
    return \App\User::create([
        'name' => 'bahdcoder',
        'email' => 'bahdcoder@gmail.com',
        'password' => bcrypt('password'),
    ]);
});


Если мы проверим это в браузере, у нас будет такой ответ json:

{
  "name": "bahdcoder",
  "email": "bahdcoder@gmail.com",
  "id": "c784692b-c7ea-4d76-9d5a-409df46d4cae",
  "updated_at": "2018-04-09 19:13:27",
  "created_at": "2018-04-09 19:13:27"
}

Отлично! Автоматически наш UUID был сгенерирован при создании модели пользователя.

Дополнительный

Необходимость делать это для всех ваших моделей привела бы к большому дублированию, поэтому у нас могла бы быть пользовательская базовая модель, которая наследуется от базовой модели laravel, и все наши модели будут расширяться от этой. Итак, давайте создадим пользовательский Итак, давайте создадим пользовательский в нашем приложении

// app/Model.php

id = uuid4();
        });
    }
}


Поэтому для любых дальнейших созданных моделей они будут расширять этот новый app\Model.php .

  • Не забудьте изменить $таблица->приращения('идентификатор'); в ваших миграциях на $таблица->строка('идентификатор'); .

Оригинал: “https://dev.to/bahdcoder/eloquent-uuids-eni”