До сегодняшнего дня, в отличие от стандартных версий Python или Java, PHP не предлагает простой способ создания универсальных уникальных идентификаторов. Некоторые разработчики могут полагаться на простые форматы, такие как сгенерированные uniqd или включенные алгоритмы хеширования. В некоторых случаях вам нужно будет генерировать эти идентификаторы только с помощью PHP и, к счастью для вас, без использования дополнительных инструментов CLI, есть полезная библиотека, полностью написанная на PHP, которая может помочь вам в этом.
Мы говорим о UUID Library от Ramsey, эта библиотека позволяет генерировать и работать с универсальными уникальными идентификаторами (UUID) RFC 4122 версии 1, 3, 4 и 5. Вы можете легко использовать эту библиотеку в своем проекте Symfony 3 с помощью composer, и мы покажем вам, как в этой статье.
1. Установите пакет UUID
В качестве первого шага вам необходимо установить библиотеку с помощью composer, поэтому откройте командную строку, перейдите в каталог вашего проекта и выполните следующую команду:
composer require ramsey/uuid
Для получения дополнительной информации об этой библиотеке, пожалуйста, посетите официальный репозиторий на Github здесь.
2. Использование библиотеки
По сути, библиотека предоставляет класс Uuid в пространстве имен Ramsey \ Uuid, поэтому вам нужно только включить его в свой контроллер. Класс предлагает 4 статических метода, по одному для каждого типа UUID с соответствующей номенклатурой, например, uuid1, uuid3, uuid4 и uuid5:
toString() . "
";
// Generate a version 3 (name-based and hashed with MD5) UUID object
$uuid3 = Uuid::uuid3(Uuid::NAMESPACE_DNS, 'php.net');
// e.g 11a38b9a-b3da-360f-9353-a5a725514269
echo $uuid3->toString() . "
";
// Generate a version 4 (random) UUID object
$uuid4 = Uuid::uuid4();
// e.g 0e9139c5-8e06-4a1a-bb5e-52a0abcd0072
echo $uuid4->toString() . "
";
// Generate a version 5 (name-based and hashed with SHA1) UUID object
$uuid5 = Uuid::uuid5(Uuid::NAMESPACE_DNS, 'php.net');
// e.g c4a760a8-dbcf-5254-a0d9-6a4474bd1b62
echo $uuid5->toString() . "
";
return new Response();
} catch (UnsatisfiedDependencyException $e) {
// Some dependency was not met. Either the method cannot be called on a
// 32-bit system, or it can, but it relies on Moontoast\Math to be present.
throw new HttpException(500, 'Caught exception: ' . $e->getMessage());
}
}
}
В библиотеке упоминается, что если вы не используете расширенные возможности для генерации идентификаторов, которые отличаются от RFC 4122, вы, вероятно, не хотите создавать экземпляр класса UUID напрямую, а вместо этого использовать статические методы.
Известные исключения
Пока вы устанавливаете и тестируете библиотеку, вы можете столкнуться с некоторыми исключениями (неудовлетворенными зависимостями) в нашем предыдущем блоке try-catch:
При вызове Ramsey \ Uuid \ Converter \ Time \ DegradedTimeCnverter :: calculateTime в 32-разрядной системе должен присутствовать Moontoast \ Math \ BigNumber.
Эта ошибка вызвана математической особенностью, которая может быть достигнута в 32-битных системах. Это происходит потому, что UUID представляет собой 128-разрядное целое число без знака, а временная часть UUID версии 1 представляет собой 64-разрядное число без знака. PHP в 32-битной системе поддерживает только целые числа со знаком до 2147483647. Вы можете легко решить эту проблему, установив пакет BigNumber для PHP с помощью composer:
composer require moontoast/math
Эта библиотека полезна для работы с целыми числами, которые больше (или могут стать больше, чем, в результате математических вычислений) максимального целочисленного значения PHP для данной системы. В 64-разрядных системах это число равно 9223372036854775807. В 32-разрядных системах оно равно 2147483647. При переполнении этой границы PHP превращает число в число с плавающей точкой, что снижает точность (см. Запись в PHP для целых чисел). Для получения дополнительной информации об этом пакете посетите официальный репозиторий в Github здесь. После установки этого пакета вы сможете нормально генерировать UUID. Если вы знаете еще одно исключение, с которым вы можете столкнуться в этой библиотеке, сообщите об этом сообществу в поле для комментариев.