《交响乐5:快车道》的封面欧宝娱乐app下载地址

欧宝娱乐app下载地址Symfony 5:快速轨道是学习现代Symfony发展,从零到生产的最好书籍。欧宝娱乐app下载地址+300页展示Symfony与Docker,欧宝娱乐app下载地址 api,队列和异步任务,Webpack, spa等。

UID组件

5.2版本
保持 没有维护的
5.1

UID组件

UID组件提供了实用程序使用惟一标识符(UID)如UUIDS和ULID。

5.1版中的新增功能:UID组件是在Symfony 5.1中引入的。欧宝娱乐app下载地址

安装

1
美元Composer需要Symfony欧宝娱乐app下载地址 / UID

请注意

如果在Symfony应用程序之外安装此组件,则必须使用欧宝娱乐app下载地址供应商/ autoload.php代码中的文件以启用Composer提供的类自动加载机制。读本文为更多的细节。

uuid

uuid(普遍独特的标识符)是软件行业中最流行的uid之一。uuid是128位的数字,通常用5组十六进制字符表示:XXXXXXX-XXXX-MXXX-NXXX-XXXXXXXXXXXX(这数字是UUID版本和N数字是UUID变体)。

生成uuids.

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

使用欧宝娱乐app下载地址Symfony组件\ \ 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散列给定的命名空间和名称。类型3用途// MD5散布和5型使用SHA-1。命名空间是另一个UUID(例如,4型UUID)//名称是任意的字符串(例如,一个产品名;如果它是唯一的)。美元的命名空间=uuid.::v4.();$名称=美元的产品->getunquename.();$ 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下载地址

//此值在其他地方生成(也可以是二进制格式)$ uuidvalue.='D9E7A184-5D5B-11EA-A62A-3499710062D0';$ uuid.=uuid.::fromString($ uuidvalue.);

转换UUIDS.

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

$ uuid.=uuid.::fromString('D9E7A184-5D5B-11EA-A62A-3499710062D0');$ uuid.->绳索();/ /字符串(16)“…”(无法打印二进制内容)$ uuid.->Tobase32.();//字符串(26)“6swygr8qav27nacahmk5rg0rpg”$ uuid.->Tobase58.();//字符串(22)“tuetywnhhmusq3xpovlv9m”$ uuid.->toRfc4122();/ /字符串(36)“d9e7a184 - 5 - d5b - 11 - ea - a62a - 3499710062 - d0”

与UUIDS合作

对象创建的UUID对象uuid.类可以使用以下方法(它们等价于UUID _ *()PHP扩展的方法):

使用欧宝娱乐app下载地址Symfony \ \ Uid \ NilUuid组件;使用欧宝娱乐app下载地址Symfony组件\ \ Uid \ Uuid;//检查uuid是否为null(请注意调用类//使用标准UUID符号代替NullUuid)$ uuid.=uuid.::v4.();$ uuid.运算符Niluuid.;// 错误的//检查uuid的类型使用欧宝娱乐app下载地址Symfony \ \ Uid \ UuidV4组件;$ uuid.=uuid.::v4.();$ uuid.运算符UuidV4;// 真的//获得UUID时间(它只能以某些UUID类型提供)$ uuid.=uuid.::v1.();$ uuid.->取得时间();// e.g.浮动(1584111384.2613)//比较uuid并检查是否相等$ uuid1=uuid.::v1.();$ uuid4=uuid.::v4.();$ uuid1->=($ uuid4);// 错误的//此方法返回:// * int(0)如果$ uuid1和$ uuid4相等// * int> 0如果$ uuid1大于$ uuid4// * int <0如果$ uuid1小于$ uuid4$ uuid1->比较($ uuid4);/ /例如int (4)

在数据库中存储uuid

如果你使用学说,考虑使用uuid.Doctrine类型,自动转换为/从UUID对象:

/ / src /实体/ Product.php命名空间应用程序\实体;使用主义\ \ ORM映射作为orm.;/ * *实体(repositoryClass = * @ORM \ App \ Repository \ ProductRepository)* /产品{/ * ** @orm \ column(type =“uuid”)* /私人someProperty美元;// ......}

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

//也有UUID V1和V6的生成器使用欧宝娱乐app下载地址Symfony \ \ \ IdGenerator \ UuidV4Generator教义的桥梁;使用欧宝娱乐app下载地址Symfony组件\ \ Uid \ Uuid;/ * *实体(repositoryClass = * @ORM \ App \ Repository \ ProductRepository)* /产品{/ * ** @ORM \ Id* @ORM \列(type = " uuid、独特= true)* @ORM \ GeneratedValue(策略= "自定义")* @orm \ customidgenerator(class = uuidv4generator :: class)* /私人$ id;// ......上市函数getid.():吗?uuid.{返回$这一点->id;}// ......}

5.2版中的新增功能:UUID类型和发电机在Symfony 5.2中引入。欧宝娱乐app下载地址

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

// src /存储库/ productRepository.php// ......ProductRepository.延伸ServiceEntityRepository{// ......上市函数findUserProducts(用户$用户):大批{qb美元=$这一点->CreatequeryBuilder.(“p”)// ......//添加“uuid”作为第三个参数,告诉学说,这是一个uuid->setParameter(“用户”,$用户->getuuid.(),“uuid”)//或者,您可以将其转换为兼容的值// Doctrine推断的类型->setParameter(“用户”,$用户->getuuid.()->绳索());// ......}}

ULIDs

ULIDs(通用唯一的字典排序标识符)128位数字通常表示为26字符串:tttttttttttrrrrrrrrrrrrrrrr.(在哪里T代表时间戳和R表示随机位)。

ulid在使用这些时是uuids的替代方案是不切实际的。它们提供128位与UUID兼容性,它们是词典的分类,它们被编码为26个字符串(VS 36角色UUID)。

请注意

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

生成ULIDs

实例化ulid.类生成随机ulid值:

使用欧宝娱乐app下载地址symfony \ component \ uid \ ulid;$ ulid=ulid.();/ /例如01 an4z07by79ka1307sr9x4mv3

如果您的ULID由另一个系统生成,请使用fromString ()创建对象的方法并使用适用于Symfony Ulid的实用程序:欧宝娱乐app下载地址

//此值在其他地方生成(也可以是二进制格式)ulidValue美元='01e439tp9xjz9rpfh3t1pybcr8';$ ulid=ulid.::fromString(ulidValue美元);

转换ulids.

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

$ ulid=ulid.::fromString('01e439tp9xjz9rpfh3t1pybcr8');$ ulid->绳索();/ /字符串(16)“…”(无法打印二进制内容)$ ulid->Tobase32.();//字符串(26)“01e439tp9xjz9rpfh3t1pybcr8”$ ulid->Tobase58.();//字符串(22)“1bkocmc5bnrvcuq2ti4eqm”$ ulid->toRfc4122();/ /字符串(36)“0171069 d - 593 d - 97 - d3 - 8 b3e - 23 - d06de5b308”

与ulids一起使用

用ulid对象创建ulid.类可以使用以下方法:

使用欧宝娱乐app下载地址symfony \ component \ uid \ ulid;$ Ulid1.=ulid.();$ Ulid2.=ulid.();//检查给定值是否为ULID有效$ Isvalid.=ulid.::已验证(ulidValue美元);// true or false//获取ULID时间$ Ulid1.->取得时间();// e.g.浮动(1584111384.2613)//比较ULID和检查平等$ Ulid1.->=($ Ulid2.);// 错误的//此方法返回$ ulid1 <=> $ ulid2$ Ulid1.->比较($ Ulid2.);// e.g.int(-1)

在数据库中存储ulid

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

/ / src /实体/ Product.php命名空间应用程序\实体;使用主义\ \ ORM映射作为orm.;/ * *实体(repositoryClass = * @ORM \ App \ Repository \ ProductRepository)* /产品{/ * ** @ORM \列(type = " ulid ")* /私人someProperty美元;// ......}

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

使用欧宝娱乐app下载地址symfony \ bridge \ doctrine \ idgenerator \ ulidgenerator;使用欧宝娱乐app下载地址symfony \ component \ uid \ ulid;/ * *实体(repositoryClass = * @ORM \ App \ Repository \ ProductRepository)* /产品{/ * ** @ORM \ Id* @orm \ column(type =“ulid”,unique = true)* @ORM \ GeneratedValue(策略= "自定义")* @ORM \ CustomIdGenerator (class = UlidGenerator::类)* /私人$ id;// ......上市函数getid.():吗?ulid.{返回$这一点->id;}// ......}

5.2版中的新增功能:Ulid类型和发电机在Symfony 5.2中引入。欧宝娱乐app下载地址

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

// src /存储库/ productRepository.php// ......ProductRepository.延伸ServiceEntityRepository{// ......上市函数findUserProducts(用户$用户):大批{qb美元=$这一点->CreatequeryBuilder.(“p”)// ......//添加'ulid'作为第三个参数,告诉学说,这是一个ulid->setParameter(“用户”,$用户->艾伦蒂利(),“ulid”)//或者,您可以将其转换为兼容的值// Doctrine推断的类型->setParameter(“用户”,$用户->艾伦蒂利()->绳索());// ......}}

这项工作包括代码样本,是在a下获得的许可创作共用BY-SA 3.0许可证。