SDK 开发高级版!揭开 Foundation-SDK 的神秘面纱

foundation-sdk 其实源自于超哥的 easyWeChat,从中提取了大量的设计理念,并且融入我对 SDK 的理解而诞生。

初级教程看这里 手把手教你开发 SDK

what's created by foundation-sdk

这里必须要列一下 foundation-sdk 在背后默默的为多少个 SDK 提供支持。

其实有点小失落,发现自己开发的 SDK 没有自己想象中那么多 T_T

file

总共有 11 个包依赖 foundation-sdk ,而我自己开发的有7个,安装了接近 3 K 次。

简介

根据本人对 SDK 的理解,此包融入了几大关键的 SDK 元素。

  • 容器
  • 配置
  • 日志
  • 缓存
  • 请求
  • token

上面并非必要元素,但都极有可能用上。

来看看 foundation-sdk 的目录
file

这是 GitHub 插件 https://github.com/buunguyen/octotree

文件意思大概都不用解释,这里重点是 高级用法

正片

Foundation

Foundation 是整个项目的核心,继承了 Pimple\Container,也就是一个容器。你所使用的 $foundation->order $foundation->config $foundation->user 等等都是因为这个是一个容器。

Foundation 中含有一个 $providers 服务提供者的数组属性。

服务提供者

这是 Foundation 的第二个精华所在,容器的最佳表现。接上面所说的,你可以在 Foundation 中注册多个服务提供者, 参考这里

新建的服务提供者需要实现 Pimple\ServiceProviderInterface,并补充完 register 方法,其实就是 new 一个类在 Foundation 中,参考这里

Config & Log & Cache

Foundation 的构造函数需要传入一个配置数组,例如 app_id, secret 等,名称不局限。此时将存入 $foundation->config 里面。

Foundation 有几个默认的读取配置。

  • debug
  • log
  • cache

举个栗子,假如你是这样使用的:

<?php

$app = new Foundation([
    'app_id' => 'xxx',
    'secret' => 'xxx',
    'debug' => true,
    'log' => [
        'name' => 'foundation',
        'file' => storage_path('logs/foundation.log'),
        'level' => 'debug',
        'permission' => 0777,
    ],
    'cache' => new Doctrine\Common\Cache\FilesystemCache(sys_get_temp_dir());
]);

从上面可以看出,上面指定了 debug 状态,日志以及缓存。

当 debug 为 false 的时候,将不会输出日志(request 请求,response 返回,假如是控制台还会有输出)。

可以看出缓存方面使用的是 Doctrine\Common\Cache\FilesystemCache ,这一部分也可以完全参考 easywechat 的缓存文档

Api & Http

凡是写 SDK 都需要去新建一个 Api 的类,这个类需要去继承 Hanson\Foundation\AbstractAPI

API 类可以实现父类的 middlewares 去增加 guzzle 的中间件,例如 header 增加 Authorization 参考这里

请求类使用的包是 guzzle 是毫无疑问的了,此外封装几个常用方法,目前来看是够用的了。

然后在 API 类里面通过 $http = $this->getHttp(); 去获得一个 Http 请求类,去根据实际场景调用不同的请求方法。

  • $http->get($url, $query = []) get 请求
  • $http->post($url, $data = []) post 请求,针对表单,使用的是 form_params
  • $http->json($url, $data = []) post 请求,针对 json
  • $http->upload($url, $query = [], $files = [], $form = []) post 请求,用于上传文件,具体我自己都觉得复杂,可以自己看看

小结

看到这里其实就介绍的差不多了,相信不少人看完会觉得有点懵,写的也不算好,讲的有点抽象,需要大家动手尝试才能加深印象。上面的 SDK 列表也可以当做学习的参考,每个 SDK 的情况都不一样,但 foundation-sdk 还是非常出色的兼容到各种不一样的情况。

篇幅有限,如果想再深入学习的同学需要去读读源码。

希望你们喜欢,来 star 一个 https://github.com/hanson/foundation-sdk

Learn from the best !

本文章首发在 Laravel China 社区

php吹水交流群 570769430