UID组件

编辑本页

UID组件

UID组件提供了可用的实用程序惟一标识符(uid),例如uuid和ULIDs。

5.1

UID组件是在Symfony 5.1中引入的。欧宝娱乐app下载地址

安装

1
Composer需要symfony欧宝娱乐app下载地址/uid

请注意

如果在Symfony应用程序外部安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。

uuid

uuid通用唯一标识符)是软件业中最受欢迎的uid之一。uuid是128位数字,通常用五组十六进制字符表示:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx(的UUID版本Ndigit是UUID变体)。

生成uuid

类的命名构造函数Uuid类或任何特定的类来创建每种类型的UUID:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
使用欧宝娱乐app下载地址组件UidUuid// UUID类型1使用您的设备的MAC地址和时间戳生成UUID。//这两个都是自动获得的,所以你不需要传递任何构造函数参数。uuid= Uuid::v1 ();// $uuid是Symfony\Component\欧宝娱乐app下载地址Uid\UuidV1的实例// UUID类型4生成一个随机的UUID,所以你不需要传递任何构造函数参数。uuid= Uuid::v4 ();// $uuid是Symfony\Component\欧宝娱乐app下载地址Uid\UuidV4的实例// UUID类型3和5生成一个散列给定名称空间和名称的UUID。第三类用途// MD5哈希,Type 5使用SHA-1。命名空间是另一个UUID(例如,Type 4 UUID)//并且名称是任意字符串(例如,产品名称;如果它是唯一的)。名称空间= Uuid::v4 ();的名字产品->getUniqueName ();uuid= Uuid::v3 (名称空间的名字);// $uuid是Symfony\Component\欧宝娱乐app下载地址Uid\UuidV3的实例uuid= Uuid::v5 (名称空间的名字);// $uuid是Symfony\Component\欧宝娱乐app下载地址Uid\UuidV5的实例// RFC 4122定义的命名空间(见https://tools.ietf.org/html/rfc4122#appendix-C)//可以作为PHP常量和字符串值uuid= Uuid::v3 (Uuid::NAMESPACE_DNS,的名字);//同:Uuid::v3('dns', $name);uuid= Uuid::v3 (Uuid::NAMESPACE_URL,的名字);//与:Uuid::v3('url', $name)相同;uuid= Uuid::v3 (Uuid::NAMESPACE_OID,的名字);//与:Uuid::v3('oid', $name)相同;uuid= Uuid::v3 (Uuid::NAMESPACE_X500,的名字);//同:Uuid::v3('x500', $name);// UUID类型6不是UUID标准的一部分它是可以按字典排序的//(像ULIDs),包含一个60位的时间戳和63位额外的唯一位。//在http://gh.peabody.io/uuidv6/中定义uuid= Uuid::v6 ();// $uuid是Symfony\Component\欧宝娱乐app下载地址Uid\UuidV6的实例

5.3

Uuid: NAMESPACE_ *常量和名称空间字符串值(“域名”“url”等)是在Symfony 5.3中引入的。欧宝娱乐app下载地址

如果您的UUID值已经以其他格式生成,请使用以下任何方法来创建Uuid对象:

1 2 3 4 5 6
//所有下面的例子都会生成相同的Uuid对象uuid= Uuid::fromString (“d9e7a184 - 5 - d5b - 11 - ea - a62a - 3499710062 - d0的);uuid= Uuid::fromBinary (“\ xd9 \ xe7 \ xa1 \ x84 \ x5d \ x5b \ x11 \ xea \ xa6 \ x2a \ x34 \ x99 \ x71 \ x00 \ x62 \ xd0”);uuid= Uuid::fromBase32 (“6 swygr8qav27nacahmk5rg0rpg”);uuid= Uuid::fromBase58 (“TuetYWNHhmuSQ3xPoVLv9M”);uuid= Uuid::fromRfc4122 (“d9e7a184 - 5 - d5b - 11 - ea - a62a - 3499710062 - d0的);

5.3

fromBinary ()fromBase32 ()fromBase58 ()而且fromRfc4122 ()方法在Symfony 5.3中介绍。欧宝娱乐app下载地址

转换uuid

使用这些方法将UUID对象转换为不同的基:

1 2 3 4 5 6
uuid= Uuid::fromString (“d9e7a184 - 5 - d5b - 11 - ea - a62a - 3499710062 - d0的);uuid->toBinary ();/ /字符串(16)“\ xd9 \ xe7 \ xa1 \ x84 \ x5d \ x5b \ x11 \ xea \ xa6 \ x2a \ x34 \ x99 \ x71 \ x00 \ x62 \ xd0”uuid->toBase32 ();/ /字符串(26)“6 swygr8qav27nacahmk5rg0rpg”uuid->toBase58 ();/ /字符串(22)“TuetYWNHhmuSQ3xPoVLv9M”uuid->toRfc4122 ();/ /字符串(36)“d9e7a184 - 5 - d5b - 11 - ea - a62a - 3499710062 - d0”

使用uuid

属性创建的UUID对象Uuid类可以使用以下方法(这些方法等价于uuid_ * ()PHP扩展的方法):

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
使用欧宝娱乐app下载地址组件UidNilUuid使用欧宝娱乐app下载地址组件UidUuid//检查UUID是否为空(注意该类被调用//用NullUuid代替NullUuid来遵循UUID标准表示法)uuid= Uuid::v4 ();uuid运算符NilUuid;/ /错误//检查UUID的类型使用欧宝娱乐app下载地址组件UidUuidV4uuid= Uuid::v4 ();uuid运算符UuidV4;/ /正确的//获取UUID datetime(它只在某些UUID类型中可用)uuid= Uuid::v1 ();uuid->getDateTime ();//返回一个\DateTimeImmutable实例//检查给定值作为UUID是否有效isValid= Uuid::isValid (uuid);// true或false//比较uuid并检查是否相等uuid1= Uuid::v1 ();uuid4= Uuid::v4 ();uuid1->= (uuid4);/ /错误//该方法返回:// * int(0)如果$uuid1和$uuid4相等// * int >如果$uuid1大于$uuid4则为0// * int < 0如果$uuid1小于$uuid4uuid1->比较(uuid4);// int(4)

5.3

getDateTime ()方法在Symfony 5.3中引入。欧宝娱乐app下载地址在以前的版本中,它被称为取得时间()

在数据库中存储uuid

如果你使用原则,可考虑使用uuidDoctrine类型,用于自动转换UUID对象:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /实体/ Product.php名称空间应用程序实体使用学说ORM映射作为ORM/ * * *@ORM实体(repositoryClass = \ App \ Repository \ ProductRepository) * /产品/ * * *@ORM\列(type = " uuid) * /私人someProperty/ /……

5.2

UUID类型在Symfony 5.2中引入。欧宝娱乐app下载地址

还有一个Doctrine生成器来帮助自动生成实体主键的UUID值:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
名称空间应用程序实体使用学说ORM映射作为ORM使用欧宝娱乐app下载地址组件UidUuid用户实现了用户界面/ * * *@ORM\ Id *@ORM\列(type="uuid", unique=true) *@ORM\ GeneratedValue(策略= "自定义")*@ORM\ CustomIdGenerator (class = " doctrine.uuid_generator ") * /私人id公共函数getId(): ?Uuid返回->id;}/ /……

当使用内置Doctrine存储库方法时(例如:findOneBy ()), Doctrine知道如何转换这些UUID类型来构建SQL查询(例如:->findOneBy(['user' => $user->getUuid()])).但是,当使用DQL查询或自己构建查询时,您将需要设置uuid作为UUID参数的类型:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /仓库/ ProductRepository.php/ /……ProductRepository扩展ServiceEntityRepository/ /……公共函数findUserProducts(用户用户数组qb->createQueryBuilder (“p”/ /……//添加'uuid'作为第三个参数,告诉Doctrine这是一个uuid->setParameter (“用户”用户->getUuid (),“uuid”//或者,您可以将其转换为与//由Doctrine推断的类型->setParameter (“用户”用户->getUuid ()->toBinary ());/ /……}}

ULIDs

ULIDs通用唯一的字典排序标识符)是128位的数字,通常以26个字符的字符串表示:TTTTTTTTTTRRRRRRRRRRRRRRRR(T表示时间戳,并且R表示随机位)。

当使用uuid不切实际时,ulid是uuid的替代方案。它们提供了与UUID的128位兼容性,它们是按字典顺序排序的,它们被编码为26个字符的字符串(而不是36个字符的UUID)。

请注意

如果在同一进程的同一毫秒内生成多个ULID,则随机部分将加1位,以提供排序的单调性。在本例中,与前面的ULID相比,随机部分不是随机的。

生成ULIDs

实例化Ulid类来生成一个随机的ULID值:

1 2 3
使用欧宝娱乐app下载地址组件UidUlidulidUlid ();//例如01AN4Z07BY79KA1307SR9X4MV3

如果您的ULID值已经以另一种格式生成,请使用以下任何方法来创建Ulid对象:

1 2 3 4 5 6
//所有下面的例子都会生成相同的Ulid对象ulid= Ulid::fromString (“01 e439tp9xjz9rpfh3t1pybcr8”);ulid= Ulid::fromBinary (“\ x01 \ x71 \ x06 \ x9d \ x59 \ x3d \ x97 \ xd3 \ x8b \ x3e \ x23 \ xd0 \ x6d \ xe5 \ xb3 \”();ulid= Ulid::fromBase32 (“01 e439tp9xjz9rpfh3t1pybcr8”);ulid= Ulid::fromBase58 (“1 bkocmc5bnrvcuq2ti4eqm”);ulid= Ulid::fromRfc4122 (0171069 d - 593 d - 97 - d3 - 8 b3e - 23 - d06de5b308”);

5.3

fromBinary ()fromBase32 ()fromBase58 ()而且fromRfc4122 ()方法在Symfony 5.3中介绍。欧宝娱乐app下载地址

还有特价NilUlid类来表示ULID价值观:

1 2 3 4
使用欧宝娱乐app下载地址组件UidNilUlidulidNilUlid ();//等价于$ulid = new ulid ('00000000000000000000000000');

5.4

NilUlid类在Symfony 5.4中引入。欧宝娱乐app下载地址

转换ULIDs

使用这些方法将ULID对象转换为不同的基:

1 2 3 4 5 6
ulid= Ulid::fromString (“01 e439tp9xjz9rpfh3t1pybcr8”);ulid->toBinary ();/ /字符串(16)“\ x01 \ x71 \ x06 \ x9d \ x59 \ x3d \ x97 \ xd3 \ x8b \ x3e \ x23 \ xd0 \ x6d \ xe5 \ xb3 \”(ulid->toBase32 ();/ /字符串(26)“01 e439tp9xjz9rpfh3t1pybcr8”ulid->toBase58 ();/ /字符串(22)“1 bkocmc5bnrvcuq2ti4eqm”ulid->toRfc4122 ();/ /字符串(36)“0171069 d - 593 d - 97 - d3 - 8 b3e - 23 - d06de5b308”

使用ulid

属性创建的ULID对象Ulid类可以使用以下方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用欧宝娱乐app下载地址组件UidUlidulid1Ulid ();ulid2Ulid ();//检查给定值是否作为ULID有效isValid= Ulid::isValid (ulidValue);// true或false//获取ULID datetimeulid1->getDateTime ();//返回一个\DateTimeImmutable实例//比较ulid并检查是否相等ulid1->= (ulid2);/ /错误//该方法返回$ulid1 <=> $ulid2 . //ulid1->比较(ulid2);// int(-1)

5.3

getDateTime ()方法在Symfony 5.3中引入。欧宝娱乐app下载地址在以前的版本中,它被称为取得时间()

在数据库中存储ulid

如果你使用原则,可考虑使用ulidDoctrine类型,自动转换为/从ULID对象:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /实体/ Product.php名称空间应用程序实体使用学说ORM映射作为ORM/ * * *@ORM实体(repositoryClass = \ App \ Repository \ ProductRepository) * /产品/ * * *@ORM\列(type = " ulid ") * /私人someProperty/ /……

还有一个Doctrine生成器来帮助自动生成实体主键的ULID值:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
名称空间应用程序实体使用学说ORM映射作为ORM使用欧宝娱乐app下载地址组件UidUlid产品/ * * *@ORM\ Id *@ORM\列(type="ulid", unique=true) *@ORM\ GeneratedValue(策略= "自定义")*@ORM\ CustomIdGenerator (class = " doctrine.ulid_generator ") * /私人id公共函数getId(): ?Ulid返回->id;}/ /……

5.2

在Symfony 5.2中引入了ULID类型和生成器。欧宝娱乐app下载地址

当使用内置Doctrine存储库方法时(例如:findOneBy ()), Doctrine知道如何转换这些ULID类型来构建SQL查询(例如。->findOneBy(['user' => $user->getUlid()])).但是,当使用DQL查询或自己构建查询时,您将需要设置ulid作为ULID参数的类型:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /仓库/ ProductRepository.php/ /……ProductRepository扩展ServiceEntityRepository/ /……公共函数findUserProducts(用户用户数组qb->createQueryBuilder (“p”/ /……//添加'ulid'作为第三个参数,告诉Doctrine这是一个ulid->setParameter (“用户”用户->getUlid (),“ulid”//或者,您可以将其转换为与//由Doctrine推断的类型->setParameter (“用户”用户->getUlid ()->toBinary ());/ /……}}

在控制台中生成和检查uuid / ulid

5.3

检查和生成uuid / ulid的命令在Symfony 5.3中引入。欧宝娱乐app下载地址

该组件提供了几个命令,用于在控制台中生成和检查uuid / ulid。它们在默认情况下是不启用的,因此在使用这些命令之前,您必须在应用程序中添加以下配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/ services.yaml服务:欧宝娱乐app下载地址Symfony命令\组件\ Uid \ \ GenerateUlidCommand:欧宝娱乐app下载地址Symfony命令\组件\ Uid \ \ GenerateUuidCommand:欧宝娱乐app下载地址Symfony命令\组件\ Uid \ \ InspectUlidCommand:欧宝娱乐app下载地址Symfony命令\组件\ Uid \ \ InspectUuidCommand:

现在您可以生成uuid / ulid,如下所示——帮助选项的命令,以了解他们的所有选项):

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#生成一个随机的UUIDPHP bin/console uuid:generate——random-based#生成一个指定节点的基于时间的UUIDPHP bin/console uuid:generate——time-based=now——node=fb3502dc-137e-4849-8886-ac90d07f64a7#生成2个uuid并以base58格式输出PHP bin/console uuid:generate——count=2——format=base58#生成一个以当前时间为时间戳的ULIDPHP bin/console ulid:生成#生成一个带有特定时间戳的ULIDPHP bin/console ulid:generate——time= . txt“2021-02-02 14:00:00”#生成2个ulid并以RFC4122格式输出PHP bin/console ulid:generate——count=2——format=rfc4122

除了生成新的UID之外,您还可以使用以下命令检查它们,以显示给定UID的所有信息:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
php bin /控制台uuid:检查d0a3a023 f515 - 4 fe0 - 915 c - 575 e63693998  ---------------------- -------------------------------------- 标签的值  ---------------------- -------------------------------------- 版本4标准(RFC 4122) d0a3a023 f515 - 4 fe0 - 915 - c - 575 - 58 SmHvuofV4GCF7QW543rDD9基地32 6 gmeg27x8n9zg92q2qbshpjecr e63693998基地  ---------------------- --------------------------------------php bin /控制台ulid: 01 f2ttcsyk1pdrh73z41bn1c4x进行检查  --------------------- -------------------------------------- 标签的值  --------------------- -------------------------------------- 规范(基地32)01 f2ttcsyk1pdrh73z41bn1c4x基地58 0178 b5a6 bygm16js4kx3vycyskkq6 RFC 4122 - 67 - d3 - 0 - d9b - 889 c - 7 f205750b09d  --------------------- -------------------------------------- 时间戳2021-04-09 08:01:24.947  --------------------- --------------------------------------
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.4支持通过私人Packagist