保举:《PHP视频教程》
正在对接第三方接口的时分,老是会看到接口后缀会带着v1,v2这样的标识,咱们晓得这些都是接口版本的概念,那末假如我方需求提供对外的接口,或许对接web端以及APP真个时分,心愿专用同一个接口,然而接口所衬着的数据体现方式没有太分歧,和接口传权也没有太分歧的状况下,若何做到应用没有同版本,且没有同版本间接互没有影响且同时共存呢?
起首笔者正在思考到接口设计时,有几年夜模块:
管制器层(controller):笔者将其界说为入口层(相称于java的dao层)
效劳层(services):逻辑效劳层,管制器入口层经过版本号标识转接到没有同的效劳层,详细的代码逻辑完成都正在此处编写
行为层(behavior):也可了解为事情层,效劳两头件,行为钩子都将正在此处管制,入口权限过滤校验,对接第三方效劳扩大经过行为钩子抽出,没有让其加年夜效劳层的代码痴肥
模子层(model):该层依据实际营业以及开发习气而定,可要可没有要
校验层(validate):笔者以为颇有须要,一切自力拉出一个目次来做相干校验,不论是自力校验,校验引擎,仍是框架自带校验都正在该目次界说,不便保护以及扩大
公共层(co妹妹on):零碎公共代码,比方附件上传,下载等
设置装备摆设层(config):外部设置装备摆设,依据需要自界说能否需求
言语包(lang):依据需要而定
复用层(tarits):依据实际需要而定
义务层(job):依据实际需要而定
目次层级如图所示:
那末正在入口层若何转接到效劳层呢?由于正在这进程咱们会将接口中的版本号转接到没有同的版本效劳层。
起首正在管制器入口层写一个基类管制器,后续一切的管制器都将会承继该类,正在结构函数中调取行为类中的解析效劳层代码,将效劳层类初始化给基类变量!
public $service = null; /** * 结构函数解决头部申请 * * @return void */ public function __construct($type = 0, Request $request) { // 登录跳过 if (!$type) { // 注册行为监听 Hook::add('app_init', [ // 校验申请接口的身份(身份验证) 'app\\saas\\behavior\\AuthToken' ]); Hook::listen('app_init', []); } // 立刻执行初始化管制器效劳使用 $this->service = Hook::exec('app\\saas\\behavior\\InitializtionService', ['tag' => $type, 'request' => $request]); }
效劳InitializtionService解析路由,判别,将效劳层实例化
public function run($params) { // 兼容管制器分层,优化管制器目次构造 $controller = request()->controller(); $controllerArray = explode('.', $controller); $controllerLength = count($controllerArray); $appendControllerName = ''; if ($controllerLength == 1) { $appendControllerName = $controllerArray[0]; } else { for ($i = 0; $i < $controllerLength - 1; $i++) { $appendControllerName .= strtolower($controllerArray[$i]) . '\\'; } $appendControllerName .= ucfirst($controllerArray[($controllerLength - 1)]); } // $controller = '\\app\\saas\\controller\\' . request()->controller(); $controller = '\\app\\saas\\controller\\' . $appendControllerName; $verion = request()->param('version'); $init_service = function () use ($controller, $verion, $params) { // dump($controller); // $controller = '\app\saas\controller\test\Test'; $reflection = new \ReflectionClass($controller); if (property_exists($controller, 'versions') && isset($reflection->getStaticProperties()['versions'][$verion]) ) { // 默许规定前往,正在前正在后没有容许前往其余信息 $service = $reflection->getStaticProperties()['versions'][$verion]; // 判别管制器效劳文件能否存正在 return class_exists($service) ? new $service($params['tag'], $params['request']) : Merror::getInstance()->jsonApi(40006); } else { Merror::getInstance()->jsonApi(40001); } }; return is_null($verion) ? Merror::getInstance()->jsonApi(40002) : $init_service(); }
这样正在管制器中文件界说以下挪用效劳层逻辑代码,而不必关怀是属于哪一个效劳层类,效劳层代码只以及版本无关
class Sysorder extends Saas { /** * 版本效劳调剂属性--必需默许一个且是v1 * * @var array */ protected static $versions = [ 'v1' => \app\saas\services\syscenter\Sysorder::class, ]; /** * 猎取信息集权限目次 * * @method POST|GET * @name getSubMenuListCate */ public function getSubMenuListCate() { return json($this->service->getSubMenuListCate()); } /** * 猎取列表 * * @method POST|GET * @name getSysOrderList */ public function getSysOrderList() { return json($this->service->getSysOrderList()); }
结语:此设计抛砖引玉,详细完成看列位phper大显身手了!
api多版本接口设计模式,能够参考(基于ThinkPhp5.1完成,框架没有同,设计理念分歧):www.kancloud.cn/lijianlin/ethantp5...
最初推行一下笔者自研的一套基于laravel设计的工作流流程引擎(https://learnku.com/laravel/t/48967),欢送钻研自研!
注:我这个设计次要是为了多版本接口开发的一种设计罢了,每一个人都有本人的开发习气,没有予强迫,只是以便代码的保护以及浏览!仅此倡议罢了
以上就是论PHP接口版本管制【兼容多端接口】的具体内容,更多请存眷资源魔其它相干文章!
标签: php开发教程 php开发资料 php开发自学 Laravel
抱歉,评论功能暂时关闭!