chippyash / sdo-pattern
服务数据对象模式。一致执行服务端点
Requires
- php: >=5.6
Requires (Dev)
- mikey179/vfsstream: 1.6.*
- phpunit/phpunit: ~4.3.0
README
质量保证
上面的徽章代表当前的开发分支。一般来说,除非测试、覆盖率和可用性可接受,否则我不会推送到GitHub。在假期、需要为其他下游项目编写代码等短暂时期,这可能不成立。如果您需要稳定的代码,请使用标记版本。请阅读“进一步文档”和“安装”。
请注意,Travis构建服务器有时不太稳定,因此构建状态可能不正确。如果您需要确定,请点击构建状态徽章,并自行检查构建。
参见测试合同
什么?
这个库提供了服务数据对象(SDO)模式。SDO有着悠久的历史,提供了一种抽象出检索和向某些远程服务端点发送数据的过程和操作的方法。该端点可以是文件、数据库、REST服务等。
本质上,您对数据存储的位置不感兴趣,只关心使用它。SDO模式抽象出检索和发送过程,使您能够集中精力使用数据。
Zend有一篇关于在PHP中实现SDO的长篇论述,它描述了一个比这个库提供的SDO基础设施更复杂的SDO基础设施。就我个人而言,我从未需要将SDO复杂化,但如果您需要,它就在那里。
为什么?
这个模式是通过多年重复相同的事情出现的
- 我需要一种格式化的数据,我可以使用它
- 数据位于某个我无法控制的端点上
如果忽略会话存储的复杂性以及SDO在飞行中的潜在缓存,SDO有一些关键元素
- 您需要一个一致的内载数据表示
- mappers提供了这个。映射器将外部格式数据(xml、json等)转换为内部格式(例如模型类),以便应用程序可以引用。映射器还将内部格式映射回外部格式以进行写入。
- 您需要验证传入的远程数据是否符合规范
- validators提供了这个
- 远程端点可能会随时间而改变
- transports促进了这一点。传输可以连接到数据库、文件存储、http端点等。
何时
当前库提供了创建SDO的基本工具,主要是所需的接口。还包括一个抽象的SDO,您可以将其扩展为您的具体实现。还提供了简单的映射器、验证器和传输。还提供了一个示例脚本,以展示如何实现它们。
如果您想了解更多,请提出建议,或者更好的是,fork它并提供一个pull请求。
查看ZF4包以获取更多包
如何
编码基础
SDO 运行有效需要三个要素:
- 一个传输接口(传输)来实际从服务端点获取和发送数据
- 一个映射接口(映射器)将外部数据映射为应用可用的格式,并将内部表示映射回服务端点理解的格式
- 一个验证接口(验证器),以确保传入的数据满足应用的要求
以下基于一个简单场景
- 数据存储在一个文件中,该文件由其他系统提供,我们无法控制
- 我们需要一个文件传输
- 外部数据格式为 json,内部格式为 StdClass
- 我们需要一个映射器,将传入的 json 映射到 StdClass,并将其回映射为 Json
- 外部数据需要匹配特定的最小模式才能有效
- 我们需要一个验证器来检查最小要求
传输
传输接口定义了两种方法:
-
public function read();
- 从远程端点读取数据
-
public function write($data);
- 将数据写入远程端点
提供的 chippyash\SDO\Transport\File 可以满足我们的需求,并接受一个构造参数,即文件的路径。
映射器
映射接口定义了两种方法:
-
public function mapIn($data);
- 将传输接口::read()获取的一些数据映射到某种内部格式
-
public function mapOut($internal);
- 将内部格式化的数据映射到外部格式,以供传输接口::write()使用
提供的 chippyash\SDO\Mapper\Json 可以满足我们的需求。
验证器
验证接口定义了一种方法:
- public function isValid($external);
- 验证通过传输接口::read()读取的外部格式数据,如果有效则返回 true,否则返回 false。
chippyash\SDO\Validator\Passthru 验证器简单地返回任何请求验证的数据为 true,并用于我们的示例。
SDO
SDO 接口定义了以下内容:
- public function fetch();
- 从远程源获取 SDO 数据,验证它并将其映射到内部格式
- public function send();
- 将内部格式数据转换为外部格式并发送到远程目标
- public function getData();
- 获取内部格式数据
- public function setData($incomingData);
- 直接设置 SDO 的内部数据结构
- public function setMapper(MapperInterface $mapper);
- 设置 SDO 的映射器
- public function setTransport(TransportInterface $transport);
- 设置 SDO 的传输
- public function setValidator(ValidatorInterface $validator);
- 设置 SDO 的验证器
对于我们的示例,我们可以通过扩展 AbstractSDO 并用以下方式构建它来创建一个简单的 SDO:
class FooSDO extends AbstractSDO {} $sdo = new FooSDO( new FileTransport(__DIR__ . '/test.json'), new JsonMapper(), new PassthruValidator() );
要读取和写入数据,我们可以使用
$obj = $sdo->fetch()->getData(); $obj->bar += 1; $sdo->send();
AbstractSDO 还支持通过魔法 __invoke 方法代理 getData() 方法,因此我们也可以这样读取和写入:
$sdo->fetch(); $sdo()->bar += 1; $sdo->send();
这显然更接近真正的 SDO 使用。
PHP 开发者完全有能力创建一个完全自管理的子类 SDO,在需要时本地缓存,仅在需要时获取和发送。在我的日常工作 中,我们拥有所有这些,以及管理整个 SDO 集合的服务类。上游的傻瓜改变了传入的有效负载;我们只需更改验证器(如果需要,见下文)。更改端点;我们更改传输。想要更改内部表示数据的方式;更改映射器。
在映射器方面,如果您需要创建复杂的数据结构,请考虑使用 Assembly Builder 或 Builder Pattern。
在验证器上,编写防御性代码。只验证你期望使用的内容,忽略其他部分。这样,当他们在不通知你的情况下更改有效载荷时,你不必关心(假设他们留下了你想要的东西!)。考虑使用功能验证
源代码可以在example/example.php中找到。
更改库
- 将其分叉
- 编写测试
- 修改它
- 发起拉取请求
发现了一个你无法解决的错误吗?
- 将其分叉
- 编写测试
- 发起拉取请求
注意。在发起拉取请求之前,确保你将代码重置到HEAD。
或者,在问题跟踪器中提出一个工单
在哪里?
该库托管在Github。它可以在Packagist.org找到
安装
安装Composer
对于生产环境
将以下内容添加到你的composer.json "requires"部分
"chippyash/sdo-pattern": ">=3,<4"
对于开发环境
克隆此仓库,然后在本地仓库根目录中运行Composer以拉取依赖项
要运行测试
git clone git@github.com:chippyash/SDO-Pattern.git chippyash-sdo cd chippyash-sdo composer install
许可证
cd chippyash-sdo vendor/bin/phpunit -c test/phpunit.xml test/
这个软件库是在BSD 3 Clause许可证下发布的
版权信息
本软件库版权所有(c)2015-2018,Ashley Kitson,英国
历史
V1.0.0 原始发布
V2.0.0 BC中断:命名空间从chippyash\SDO更改为Chippyash\SDO
V2.0.1 更新示例
V2.0.2 添加包链接
V2.0.3 验证PHP7兼容性
V2.0.4 更新构建脚本
V3.0.0 BC中断。撤回对PHP <5.6的支持
V3.1.0 许可证从GPL V3更改为BSD 3 Clause