前言
随着互联网的发展,业务体量的递增,传统单体应用逐步演变为拆分多个模块应用进行分布式部署,甚至演变为微服务架构应用,在这种环境下,一个复杂的业务功能往往需要多个平台服务联动才可以完成,我们的业务系统在调用别人的系统服务同时,也可能对外提供接口服务,供其他系统调用。今天,我们就如何快速的为你的项目构建一个PHP版本SDK展开讨论
Easy-sdk项目简介
Easy-sdk是一个用于快速构建PHP版本SDK的应用框架,通过此框架,开发人员可以快速将当前系统对外提供的功能服务封装成PHP版本的SDK,供其他PHP项目快速引入并使用当前系统提供的功能服务,完成相应的业务逻辑。为了让开发人员更好的上手使用,系统实现上主要借鉴Laravel、easy-wechat等项目的相关设计,某些框架功能使用上与Laravel、easy-wechat基本保持一致。
项目地址: github.com/itsanr-oris/easy-sdk
基本使用
1. 安装easy-sdk-installer
通过composer进行全局安装,如下
$ composer global require f-oris/easy-sdk-installer
注意需要将 ~/.composer/vendor/bin
目录设置到PATH环境变量中,否则无法识别第二步中的easy-sdk命令
2. 创建Sdk应用
执行Sdk初始化创建命令
$ easy-sdk new sdk-demo
按照命令行提示,依次输入以下包名、介绍、作者、根命名空间,easy-sdk
指令会读取当前目录信息以及Git认证信息生成默认SDK应用信息,如不需要调整,直接回车确认即可
3. Sdk组件开发
进入sdk-demo
目录,执行命令创建组件
php artisan make:component Hello/Hello
命令执行完毕后,即可在src
目录内可以看到Hello
子目录,子目录内包含一个Hello.php文件,这个文件内只是一个空的组件类,我们需要根据业务完善相关业务代码。以输出一句“Hello, easy sdk framework.”为例,代码片段如下
<?php
// ...
class Hello extends Component
{
/**
* Return a hello message.
*
* @return string
*/public function hello(){return "Hello, easy sdk framework.";}
}
4. Sdk组件测试
在tests
下新建Hello
文件夹,新建HelloTest.php测试类,需要继承基类tests/TestCase.php,按照常规的phpunit进行测试即可,如下
<?php
// ...
class HelloComponentTest extends TestCase
{
/**
* Test get a hello message from hello component.
*/public function testGetAHelloMessageFromHelloComponent(){$this->assertEquals('Hello, easy sdk framework.', $this->app()->get(Hello::name())->hello());}
}
5. 发布Sdk代码包
功能测试完毕后,按照packagist组件包发布指引,发布Sdk代码包,待composer仓库同步完毕后,即可通过composer拉取sdk组件代码包进行使用
使用扩展包扩展系统功能
Easy-sdk只是一个简单的Sdk应用框架,主要用于Sdk应用的组件管理,本身并不提供太多复杂功能,可通过引入外部组件扩展包来丰富Sdk应用的基础功能服务,以较为常用的Http服务为例,为Sdk应用引入Http功能组件。
1. 引入功能组件包
进入sdk-demo
目录,通过composer引入http组件包
$ composer require f-oris/easy-sdk-httpclient
2. 发布Http组件配置文件
进入sdk-demo
目录,执行artisan命令
$ php artisan vendor:publish --provider="Foris\Easy\Sdk\HttpClient\ServiceProvider"
命令执行完毕后,即可在项目目录内config
文件下找到http-client.php
配置文件
3. 使用Http组件服务
每一个Sdk组件都是通过Application获取到相应的组件实例才能进行调用相应的组件功能方法,获取Http组件的方式实例如下:
<?php
//...
$http = (new Application())->get(\Foris\Easy\HttpClient\HttpClient::class);
由于组件的生命周期其实是包含在Application的生命周期里面的,所以,在组件中就不能以上述方式进行调用,组件的调用方式如下:
<?php
//...
$http = $this->app()->get(\Foris\Easy\HttpClient\HttpClient::class);
另外,eask-sdk-httpclient扩展包提供了一个HasHttpClient
的Trait类,开发人员可以在src/Component.php
文件中引入并使用该类,简化之后的Http组件调用方式如下
<?php
//...
$http = $this->http();
Http组件扩展包提供具体功能参考f-oris/easy-sdk-httpclient扩展包说明
4. 扩展包列表
- easy-sdk-logger Logger组件包
- easy-sdk-httpclient HttpClient组件包
- easy-sdk-cache Cache组件包
- easy-sdk-develop Easy-sdk开发辅助扩展包
其他
1. 关于项目
项目主要是源于笔者所在的开发团队需要对接数个平台服务来实现自己的系统业务,然后大部分第三方都只是提供一个http接口文档,然后需要开发人员自己去实现具体的对接逻辑,然后再到业务对接,整个过程中,重复工作挺多的,而且由于没有相应的规范,不同系统、不同开发人员对接出来的代码逻辑质量也参差不齐,出问题了,都是按照各自的规范去进行排查,难以统筹管理。因此,基于自己熟悉的Laravel框架以及使用过的easy-wechat扩展包,移植了部分功能代码,用于简化统一SDK应用的构建。
2. 未来方向
其实这个项目还有很多功能待完善的,都是在想,比如说Sdk文档的自动化构建(Ps:我也很讨厌写文档,但是文档还是很重要的),简化测试代码的编写流程,PHP各种版本的一些兼容性修复测试(目前基本上兼容5.5+,但某些测试代码在7.x下无法执行…)等,这个项目本身还是挺好玩的,有兴趣的童鞋可以一起玩。