firemidge/标识符

提供标识符类(例如 UUIDIdentifier)

v2.1 2022-07-19 22:31 UTC

README

这个小库提供将ID转换为值对象(interfaces 和 implementations)的接口。

质量控制

以下表格在每次代码更新时都会更新,并使用 PhpUnit(单元测试工具)和 Infection(突变测试工具)生成。

为什么使用值对象而不是标量类型?

有很多好处,但以下可能是最显著的。

表达性

使用值对象意味着您的类型提示变得更加表达。即使您的代码缺少文档块,也可以更清楚地知道需要传递(和/或返回)什么,例如:

public function findById(UserId $id) : ?User;

与以下相反:

public function findById(string $id) : ?User;

验证

特别是如果您使用没有标量类型的UUID作为标识符,您将受益于额外的验证,例如从用户输入或URL中读取ID。

$userId = UserId::fromString($idString);

您甚至可以在上面添加额外的验证来验证ID是现有实体的ID,而不仅仅是匹配格式。

在传递错误顺序时及早检测错误

考虑以下参数列表:

public function __construct(string $id, string $projectId, string $creatorId)

如果您以错误的顺序调用此构造函数(如果在某个时候重构了签名,这种情况很容易发生),则您的IDE或运行时都无法检测到错误,您可能会在以后的某个时间点遇到实体未找到的错误,这会导致调试更加困难。另一方面,如果您的签名如下:

public function __construct(FileId $id, ProjectId $projectId, CreatorId $creatorId)

... 如果您使用的是相当好的IDE,您的IDE将能够检测到任何传递顺序错误的参数 - 最晚,您将在运行时遇到一个更有用的错误,这会直接带您找到错误。

类型更改

使用值对象作为标识符还意味着您可以在以后更改标识符的类型,而不会影响您的其余代码库,例如从数字ID到UUID。您只需更改您的标识符值对象以扩展不同的标识符类型。

如果更改标识符类型是您项目的考虑事项,请尽量使用直接在 Identifier 接口上可用的方法,而不是在更具体接口上的更具体方法,以帮助过渡。

如何使用此库

您可以直接在代码库中对 UuidIdentifier 或 IntIdentifier 进行类型提示,然而,为了获得最大好处,建议创建非常具体的类,该类从标识符实现之一扩展(或创建自己的并实现 Identifier 接口)。

示例

<?php
declare(strict_types=1);

namespace My\Own;

use FireMidge\Identifier\Implementation\UuidId;

class FileId extends UuidId
{
}

不需要类体。

用法

$fileId = FileId::fromString('4ab01c13-f9c2-4bbc-9b6b-95c416d99593');

$newFileId = FileId::generate();