legolabs / values
替身对象。高效构建模型、API客户端等的方式
Requires
- php: ^8.1
Requires (Dev)
- phpunit/phpunit: ^6
This package is auto-updated.
Last update: 2024-09-06 13:14:19 UTC
README
仅创建一个支持php ^8.2而非^7.1的packagist包。只需在正确位置放置一些#[AllowDynamicProperties]。
您的“替身”对象
这种方法试图从数组和对象世界中汲取最佳之处。因此,使用这个库,您可以像往常一样处理对象,但内部一切都是存储在数组中。数组很容易从对象中检索或设置。
可用于
- 与MongoDB交互 - makasim/yadm。
- 描述API客户端 - formapro/telegram-bot。
- 描述领域模型 - formapro/pvm
- 描述MQ消息。
一个对象为我们提供了一个容易依赖的契约。我们可以为类添加类型提示,使用自动完成其方法。这是好的一面,但是填充对象数据或获取其当前状态并不容易或便宜。我们提供了各种工具,如序列化器、转换器等。当我们必须处理对象树时,事情变得更糟。
一个数组容易存储或发送。无论何时调用API或对数据库进行查询,您最终都会与数组一起工作。这是强项,但它不提供任何契约,当数组结构改变时,代码很容易被破坏。
示例
获取仓库信息示例
让我们使用Github API并获取Symfony仓库的信息。这里是实际响应,我们将使用简化的版本。
<?php namespace Acme; use Legolabs\Values\ValuesTrait; use Legolabs\Values\ObjectsTrait; use function Legolabs\Values\set_values; class Repo { use ValuesTrait; use ObjectsTrait; public function getStargazersCount() { return $this->getValue('stargazers_count'); } /** @return Owner */ public function getOwner() { return $this->getObject('owner', Owner::class); } } class Owner { use ValuesTrait; public function getId() { return $this->getValue('id'); } public function getLogin() { return $this->getValue('login'); } } $data = json_decode(' { "id":458058, "name":"symfony", "full_name":"symfony/symfony", "owner":{ "login":"symfony", "id":143937, }, "stargazers_count":13945, } ', true); $repo = new Repo(); set_values($repo, $data); $repo->getStargazersCount(); // 13945 $repo->getOwner()->getLogin(); // symfony
创建新gist
现在,让我们创建一个新的gist。根据Github API,我们必须发送一个包含文件集合的对象。让我们创建Gist和GistFile对象。用数据填充它们并将其作为数组获取。
<?php namespace Acme; use Legolabs\Values\ObjectsTrait; use Legolabs\Values\ValuesTrait; class Gist { use ValuesTrait; use ObjectsTrait; public function setDescription($description) { $this->setValue('description', $description); } public function setPublic($bool) { $this->setValue('public', $bool); } public function addFile($fileName, GistFile $file) { $this->addObject('files', $file, $fileName); } } class GistFile { use ValuesTrait; public function __construct($content) { $this->setValue('content', $content); } } $file = new GistFile('String file contents'); $gist = new Gist(); $gist->setDescription('the description for this gist'); $gist->setPublic(true); $gist->addFile('file1.txt', $file); get_values($gist); /* [ 'description' => 'the description for this gist', 'public' => true, 'files' => [ 'file1.txt' => [ 'content' => 'String file contents', ] ] ] */ // now you can send it to api.
由Forma-Pro开发
Forma-Pro是一家全栈开发公司,其兴趣也扩展到了开源开发。作为一个强大的专业团队,我们致力于通过开发电子商务、Docker和面向微服务的架构等领域的前沿解决方案来帮助社区。我们的主要专业领域是基于Symfony框架的解决方案,但我们始终寻找允许我们以最佳方式完成工作的技术。我们致力于创建革命性的解决方案,以改变在架构和可扩展性方面的开发方式。
如果您对我们开源开发有任何疑问和咨询,特别是关于此产品或其他任何问题,请随时联系opensource@forma-pro.com
许可
它是在MIT许可证下发布的。