dragonmantank / plinth
构建 SDK 的基础层
Requires
- php: ^8.1
- laminas/laminas-diactoros: ^2.17
- php-http/discovery: ^1.14
- psr/http-client: ^1.0
- psr/http-message: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.11
- php-http/guzzle7-adapter: ^1.0
- phpunit/phpunit: ^9.5
README
构建 SDK 的基础接口和 HTTP 客户端。Plinth 会为您处理与 HTTP API 通信的基本操作,并提供方便的方法,帮助您构建更好的 API 和 SDK。多考虑一下您为客户解决的实际问题,而不仅仅是构建简单的 GET/PUT/POST 请求。
如果您想为用户提供出色的 SDK,您需要做的不仅仅是封装 HTTP 调用。像 Guzzle 这样的工具使任何人都能轻松地发起 HTTP 调用。您的 SDK 应该解决用户的实际问题,并减少他们需要编写的 HTTP 模板代码。让 Plinth 处理所有丑陋的事情,您只需专注于为用户提供易用的接口。
Plinth 兼容 PSR-7,并接受任何 PSR-18 HTTP 客户端来处理底层的 HTTP 请求。这使得它与许多 HTTP 客户端兼容,如 Guzzle 和 Symfony HTTP Client。
为什么?
我花了很多年构建 SDK,这不仅是我日常工作的一部分,也因为许多公司没有为他们的服务提供 PHP SDK。大多数 HTTP API 都倾向于较为 RESTful,并提供了相同的 CRUD 操作。封装 HTTP 容易又无聊。
虽然我可以直接使用 Guzzle 解决问题,但很多时候这意味着反复封装 Guzzle(或任何其他 HTTP 客户端)的认证机制、头部信息等。为什么不直接简化添加头部信息和认证等少量额外操作,并有一个预包装的方式来发起 HTTP 调用呢?
第二件与我密切相关的事情是,SDK 远远不止是 HTTP 客户端的包装。任何人都可以将 Guzzle 等工具添加到项目中并发起 HTTP 调用。SDK 应该使解决用户面临的特定问题变得容易。SDK 应该提供方法来简化用户通过复杂工作流程,并应该有一个基于问题的公共 API,而不是基于 URL。
这就是 Plinth 发挥作用的地方。Plinth 让您摆脱对原始 HTTP 调用的思考,更多地关注封装重要项。对于同时从事 API 开发的开发者,它让您以操作而不是 HTTP 动词的角度来思考。Plinth 首先是一个 API 客户端,因此试图隐藏大多数通用的 HTTP 流程,并让您专注于 API 的输入和输出数据。
要求
- PHP 8.1+
- 任何 PSR-18 HTTP 客户端或 HTTPlug 适配器
安装
Plinth 可以通过 Composer 安装。
$ composer require dragonmantank/plinth
我们还建议安装适合您应用程序使用的 HTTP 客户端的相关 HTTPlug 适配器,如果它尚未兼容 PSR-18。一些常见的适配器有:
用法
Plinth 可以用作 SDK 的依赖项,或作为 SDK 的基类。
作为类依赖项
这是推荐使用Plinth的方式。您创建的SDK将接受一个Dragonmantank\Plinth\ClientInterface
对象作为构造函数依赖项,当您需要发起HTTP调用时,可以在SDK的业务逻辑中调用这个注入对象。
use Dragonmantank\Plinth\ClientInterface; class OurSDK { public function __construct(protected ClientInterface $plinth) { } public function createUser($userData): User { $response = $this->plinth->create('user', $userData); $user = new User($response); return $user; } public function removeUser(User $user): void { $this->plinth->delete('user/' . $user->id); } }
作为基类
如果您的API是新的,或者您有部分功能未完全支持的API(例如,alpha或beta API路由),您可以直接扩展Plinth客户端以提供易于使用的函数,甚至可以直接向您的API发送PSR-7请求。
use Dragonmantank\Plinth\Client; class OurSDK extends Client { // All the basic HTTP calls are available directly to the user public function createUser($userData): User { $response = $this->create('user', $userData); $user = new User($response); return $user; } }
配置选项
Plinth支持一些配置选项,可以帮助您控制API调用如何处理。
decode_json
: bool - 如果您的API返回JSON,Plinth可以自动将其转换为关联数组。这是默认启用的。authentication_handler
: 可调用对象 - 您可以将可调用对象或匿名函数作为认证处理器传递,它可以在请求中添加您的认证参数。