个性化阅读
专注于IT技术分析

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

本文概述

到目前为止, 与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:

<?php

namespace 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 Namespaces
use 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-4ccc6ab413a6
            echo $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-a5a725514269
            echo $uuid3->toString() . "<br>";
        
            // Generate a version 4 (random) UUID object
            $uuid4 = Uuid::uuid4();

            // e.g 0e9139c5-8e06-4a1a-bb5e-52a0abcd0072
            echo $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-6a4474bd1b62
            echo $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。如果你知道该库可能遇到的另一个例外, 请在注释框中与社区共享。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 3中生成通用唯一标识符(UUID)

评论 抢沙发

评论前必须登录!