В этом уроке я собираюсь показать вам, как и зачем использовать 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”