gocanto / relay
统一数据传输对象,不依赖于任何框架。
Requires
- php: ^7.4
- ext-json: *
- nesbot/carbon: ^2.32
- symfony/validator: ^5.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.0.0
- mockery/mockery: ^1.0.0
- phpmd/phpmd: ^2.0.0
- phpunit/phpunit: ^9.0.0
- squizlabs/php_codesniffer: ^3.0.0
- vimeo/psalm: ^3.0.0
This package is auto-updated.
Last update: 2024-09-20 16:26:50 UTC
README
Relay 是一种数据传输对象结构,允许您消费第三方 API 负载,并通过促销映射器将它们解析为正确的类型对象,以确保传入的数据符合预期的类型。
它是如何工作的?
Relay 是一个自包含的属性包,使用促销器映射其值,将给定的传入负载解析为有效数据传输对象。因此,您可以通过使用适当的类型通过包装器来移除在您的应用程序中处理无结构数据的能力,这些包装器负责任何清理和验证逻辑约束。
什么是促销器?
促销器是一种数据结构,允许我们将给定数据映射到所需的数据类型。通过这样做,我们将能够使用适当的类型来保护未知负载。例如,您可以将 first_name 键值指定为 text 类型,以防止在约束失败时创建传输对象。
此外,如果您不确定键值属于哪种数据类型,您可以将键值标记为 Any。
案例研究
让我们假设我们正在从活动平台消费第三方 API,并将其持久化到我们的数据库中。通常,您将收到有关用户的信息,例如电子邮件、姓名或个人资料 URL。这是一个相当具有挑战性的场景,因为您必须验证和清理传入的负载,以避免在您的应用程序中出现不一致的数据。
现在,如果您像我一样,您可能正在想将传入的负载解析为一个数组,然后通过访问数组并询问我们是否获得了有效的信息来验证键值。例如
$payload = [ 'name' => 'Gustavo', 'email' => 'gustavoocanto@gmail.com', 'profile_url' => 'http://foo.com/gocanto', ]; if (isset($payload['name']) && is_string($payload['name'])) { //do something amazing! } //is_valid_email is a imaginary function that should check whether a given email is valid or not. if (isset($payload['email']) && is_valid_email($payload['email'])) { //do something amazing! } //is_valid_url is a imaginary function that should check whether a given URL is valid or not. if (isset($payload['profile_url']) && is_valid_email($payload['profile_url'])) { //do something amazing! }
如你所见,这可能会因为许多原因而迅速失控。以下是其中的一些原因:
- 每次您需要在您的应用程序中引用此信息时,您都需要重复自己。
- 这些验证没有考虑到更复杂的验证。例如,不同类型的电子邮件、URL 或更复杂的字符串规则。
- 无结构数据会促进以任何给定时间引入许多错误到您的应用程序的方式。
然而,我们都是好的程序员,喜欢做得更好。此外,我们喜欢使用
types,不是吗?
使用 relay 处理您的负载。
在您将 relay 数据传输安装到您的应用程序后,您将能够像这样消费上述负载
declare(strict_types=1); use Gocanto\Relay\Attributes; use Gocanto\Relay\Types\Url; use Gocanto\Relay\Types\Email; use Gocanto\Relay\Types\Text; use Gocanto\Relay\Promoter; $data = [ 'name' => 'Gustavo', 'email' => 'gustavoocanto@gmail.com', 'profile_url' => 'http://foo.com/gocanto', ]; class Payload extends Attributes { } $payload = new Payload($data, [ 'name' => Promoter::make(Text::class), 'email' => Promoter::make(Email::class), 'profile_url' => Promoter::make(Url::class), ]); /** @var Text $name */ $name = $payload->get('name'); /** @var Email $email */ $email = $payload->get('email'); /** @var Url $profileUrl */ $profileUrl = $payload->get('profile_url');
此外,如果您请求的负载键没有指定映射或在使用促销器对象的 ::optional() 构造方法中标记为可选,您将获得 Any 对象包装器。查看示例
注意:在您的负载映射器中指定的任何键值都被标记为必需。
如果您想了解更多关于功能和使用方式的信息,请点击这里。
支持的类型
- 布尔型
- 整数型
- 浮点数(浮点数,又称双精度浮点数)
- 字符串型
- 混合型
- 数字型
- URL
- 电子邮件
- UUID
- 日期
要了解更多关于它们的功能,您可以点击以下链接
未来方向。
- 更简单的映射机制。
- 添加更多类型。
- 为
dot数组访问添加测试。 - 您有什么想法吗?
贡献
请随意fork这个包,通过提交拉取请求来增强其功能。
许可协议
MIT 许可协议(MIT)。请参阅许可文件以获取更多信息。
我该如何感谢您呢?
为什么不给GitHub仓库点个星并分享这个仓库的链接到Twitter呢?
别忘了关注我的Twitter!
谢谢!
Gustavo Ocanto。