UID组件
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
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版本N
digit是UUID变体)。
生成uuid
类的命名构造函数Uuid
类或任何特定的类来创建每种类型的UUID:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
使用欧宝娱乐app下载地址\组件\Uid\Uuid;// 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的实例// UUID类型6不是UUID标准的一部分它是可以按字典排序的//(像ULIDs),包含一个60位的时间戳和63位额外的唯一位。//在http://gh.peabody.io/uuidv6/中定义$uuid= Uuid::v6 ();// $uuid是Symfony\Component\欧宝娱乐app下载地址Uid\UuidV6的实例
如果您的UUID是由其他系统生成的,请使用fromString ()
方法来创建一个对象,并使用Symfony uuid可用的实用程序:欧宝娱乐app下载地址
1 2 3
//该值在其他地方生成(也可以是二进制格式)$uuidValue=“d9e7a184 - 5 - d5b - 11 - ea - a62a - 3499710062 - d0的;$uuid= Uuid::fromString ($uuidValue);
转换uuid
使用这些方法将UUID对象转换为不同的基:
1 2 3 4 5 6
$uuid= Uuid::fromString (“d9e7a184 - 5 - d5b - 11 - ea - a62a - 3499710062 - d0的);$uuid->toBinary ();/ /字符串(16)“…”(二进制内容无法打印)$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
使用欧宝娱乐app下载地址\组件\Uid\NilUuid;使用欧宝娱乐app下载地址\组件\Uid\Uuid;//检查UUID是否为空(注意该类被调用//用NullUuid代替NullUuid来遵循UUID标准表示法)$uuid= Uuid::v4 ();$uuid运算符NilUuid;/ /错误//检查UUID的类型使用欧宝娱乐app下载地址\组件\Uid\UuidV4;$uuid= Uuid::v4 ();$uuid运算符UuidV4;/ /正确的//获取UUID时间(仅在某些UUID类型中可用)$uuid= Uuid::v1 ();$uuid->取得时间();//例如:float(1584111384.2613)//比较uuid并检查是否相等$uuid1= Uuid::v1 ();$uuid4= Uuid::v4 ();$uuid1->= ($uuid4);/ /错误//该方法返回:// * int(0)如果$uuid1和$uuid4相等// * int >如果$uuid1大于$uuid4则为0// * int < 0如果$uuid1小于$uuid4$uuid1->比较($uuid4);// int(4)
在数据库中存储uuid
如果你使用原则,可考虑使用uuid
Doctrine类型,用于自动转换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;/ /……}
还有一个Doctrine生成器来帮助自动生成实体主键的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
//也有UUID V1和V6的生成器使用欧宝娱乐app下载地址\桥\学说\IdGenerator\UuidV4Generator;使用欧宝娱乐app下载地址\组件\Uid\Uuid;/ * * *@ORM实体(repositoryClass = \ App \ Repository \ ProductRepository) * /类产品{/ * * *@ORM\ Id *@ORM\列(type="uuid", unique=true) *@ORM\ GeneratedValue(策略= "自定义")*@ORM\ CustomIdGenerator (class = UuidV4Generator::类)* /私人$id;/ /……公共函数getId():哦?Uuid{返回$这->id;}/ /……}
5.2
UUID类型和生成器是在Symfony 5.2中引入的。欧宝娱乐app下载地址
当使用内置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下载地址\组件\Uid\Ulid;$ulid=新Ulid ();//例如01AN4Z07BY79KA1307SR9X4MV3
如果您的ULID是由另一个系统生成的,请使用fromString ()
方法来创建一个对象,并使用Symfony ULIDs可用的实用程序:欧宝娱乐app下载地址
1 2 3
//该值在其他地方生成(也可以是二进制格式)$ulidValue=“01 e439tp9xjz9rpfh3t1pybcr8”;$ulid= Ulid::fromString ($ulidValue);
转换ULIDs
使用这些方法将ULID对象转换为不同的基:
1 2 3 4 5 6
$ulid= Ulid::fromString (“01 e439tp9xjz9rpfh3t1pybcr8”);$ulid->toBinary ();/ /字符串(16)“…”(二进制内容无法打印)$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下载地址\组件\Uid\Ulid;$ulid1=新Ulid ();$ulid2=新Ulid ();//检查给定值是否作为ULID有效$isValid= Ulid::isValid ($ulidValue);// true或false//获取ULID时间$ulid1->取得时间();//例如:float(1584111384.2613)//比较ulid并检查是否相等$ulid1->= ($ulid2);/ /错误//该方法返回$ulid1 <=> $ulid2 . //$ulid1->比较($ulid2);// int(-1)
在数据库中存储ulid
如果你使用原则,可考虑使用ulid
Doctrine类型,自动转换为/从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 24 25 26
使用欧宝娱乐app下载地址\桥\学说\IdGenerator\UlidGenerator;使用欧宝娱乐app下载地址\组件\Uid\Ulid;/ * * *@ORM实体(repositoryClass = \ App \ Repository \ ProductRepository) * /类产品{/ * * *@ORM\ Id *@ORM\列(type="ulid", unique=true) *@ORM\ GeneratedValue(策略= "自定义")*@ORM\ CustomIdGenerator (class = UlidGenerator::类)* /私人$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 ());/ /……}}