如何在Symfony 3中生成通用唯一标识符(UUID)

本文概述

  • 1.安装UUID软件包
  • 2.使用库
  • 已知异常
到目前为止, 与Python或Java的标准版本不同, PHP并未提供一种简便的方法来本地生成通用唯一标识符。一些开发人员可以依靠uniqd生成的或包含的哈希算法的简单格式。在某些情况下, 你将只需要使用PHP生成这些标识符, 而无需依赖于额外的CLI工具, 对于你来说幸运的是, 有一个完全用PHP编写的有用的库可以帮助你。
我们正在谈论Ramsey编写的UUID库, 该库允许你生成和使用RFC 4122版本1、3、4和5通用唯一标识符(UUID)。你可以使用composer在Symfony 3项目上轻松使用此库, 我们将在本文中向你展示如何使用。
1.安装UUID软件包第一步, 你需要使用composer安装该库, 因此打开命令行, 切换到项目目录并执行以下命令:
composer require ramsey/uuid

有关此库的更多信息, 请访问Github上的官方存储库。
2.使用库基本上, 该库在Ramsey \ Uuid命名空间中公开Uuid类, 因此你只需要将其包含在控制器中即可。该类提供4种静态方法, 每种UUID类型都有一个相应的命名法, 例如uuid1, uuid3, uuid4和uuid5:
< ?phpnamespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpException; // Include Library Namespacesuse Ramsey\Uuid\Uuid; use Ramsey\Uuid\Exception\UnsatisfiedDependencyException; class DefaultController extends Controller{/*** @Route("/", name="homepage")*/public function indexAction(Request $request){try {// Generate a version 1 (time-based) UUID object$uuid1 = Uuid::uuid1(); // e.g ba51070a-d754-11e7-b225-4ccc6ab413a6echo $uuid1-> toString() . "< br> "; // 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-a5a725514269echo $uuid3-> toString() . "< br> "; // Generate a version 4 (random) UUID object$uuid4 = Uuid::uuid4(); // e.g 0e9139c5-8e06-4a1a-bb5e-52a0abcd0072echo $uuid4-> toString() . "< br> "; // 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-6a4474bd1b62echo $uuid5-> toString() . "< br> "; 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块中可能会遇到一些异常(未满足的依赖项):
在32位系统上调用Ramsey \ Uuid \ Converter \ Time \ DegradedTimeCnverter :: calculateTime时, 必须存在Moontoast \ Math \ BigNumber。此错误是由于可以在基于32位的系统中实现的数学功能引起的。发生这种情况是因为UUID是一个无符号的128位整数, 而版本1 UUID的时间部分是一个无符号的64位数字。 32位系统上的PHP仅支持最大2147483647的带符号整数。你可以使用composer轻松解决它为PHP安装BigNumber软件包的问题:
composer require moontoast/math

该库对于处理大于(或可能通过数学计算变得大于)给定系统的PHP的最大整数值的整数很有用。在64位系统上, 该数字为9223372036854754775807。在32位系统上, 该数字为2147483647。当溢出此边界时, PHP会将数字转换为浮点数, 从而降低了精度(请参阅PHP手册中的Integers)。有关此软件包的更多信息, 请访问Github上的官方存储库。安装此软件包后, 你应该能够正常生成UUID。如果你知道该库可能遇到的另一个例外, 请在注释框中与社区共享。
【如何在Symfony 3中生成通用唯一标识符(UUID)】编码愉快!

    推荐阅读