firemidge / 标识符
提供标识符类(例如 UUIDIdentifier)
Requires
- php: ^8.1
Requires (Dev)
- ext-gd: *
- ext-intl: *
- phpunit/phpunit: ^9
This package is auto-updated.
Last update: 2024-09-20 03:08:02 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();