PHP接口版本如何控制兼容多端接口

  

这篇文章主要介绍PHP接口版本如何控制兼容多端接口,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

  ,,,,,,,,,,,,,,   ,,,,,,,,,,,,,,

 PHP接口版本如何控制兼容多端接口

在对接第三方接口的时候,总是会看到接口后缀会带着v1、v2这样的标识,我们知道这些都是接口版本的概念,那么如果我方需要提供对外的接口,或者对web端接和应用端的时候,希望公用同一个接口,但是接口所渲染的数据表现形式不太一致,以及接口授权也不太一致的情况下,如何做到使用不同版本,且不同版本直接互不影响且同时共存呢?

首先笔者在考虑到接口设计时,有几大模块:

    <李>

    控制器层(控制器):笔者将其定义为入口层(相当于java的dao层)

    <李>

    服务层(服务):逻辑服务层,控制器入口层通过版本号标识转接到不同的服务层,具体的代码逻辑实现都在此处编写

    <李>

    行为层(行为):也可理解为事件层,服务中间件,行为钩子都将在此处控制,入口权限过滤校验,对接第三方服务扩展通过行为钩子抽出,不让其加大服务层的代码臃肿

    <李>

    模型层(模型):该层根据实际业务和开发习惯而定,可要可不要

    <李>

    校验层(验证):笔者认为很有必要,所有独立拉出一个目录来做相关校验,不管是独立校验,校验引擎,还是框架自带校验都在该目录定义,方便维护和扩展

    <李>

    公共层(常见):系统公共代码,比如附件上,传下载等

    <李>

    配置层(配置):内部配置,根据需求自定义是否需要

    <李>

    语言包(lang):根据需求而定

    <李>

    复用层(tarits):根据实际需求而定

    <李>

    任务层(工作):根据实际需求而定

目录层级如图所示:
 PHP接口版本如何控制兼容多端接口

那么在入口层如何转接到服务层呢?因为在这过程我们会将接口中的版本号转接到不同的版本服务层。
首先在控制器入口层写一个基类控制器,后续所有的控制器都将会继承该类,在构造函数中调取行为类中的解析服务层代码,将服务层类初始化给基类变量!

公共美元服务=零;/* *
  *构造函数处理头部请求
  *
  * @return无效
  */公共函数__construct (type=0美元,请求请求)
  {//登录跳过
  如果(! $类型){//注册行为监听
  钩:add (& # 39; app_init& # 39;, (//校验请求接口的身份(身份验证)
  & # 39;行为saas应用程序\ \ \ \ \ \ authtoken # 39;
  ]);
  钩::听(& # 39;app_init& # 39;, []);
  }//立即执行初始化控制器服务应用
  $ this→服务=钩::exec (& # 39; saas应用程序\ \ \ \ \ \行为InitializtionService& # 39;,[& # 39;标签# 39;=比;类型,美元& # 39;请求# 39;=比;$请求]);
  }

服务InitializtionService解析路由,判断,将服务层实例化

公共函数运行(params)美元
  {//兼容控制器分层,优化控制器目录结构
  美元=请求()→控制器();
  $ controllerArray=爆炸(& # 39;强生# 39;,美元控制器);
  $ controllerLength=count ($ controllerArray);
  $ appendControllerName=& # 39; & # 39;;
  如果(controllerLength==1美元){
  appendControllerName=controllerArray美元[0];
  其他}{
  ($ i=0;美元我& lt;controllerLength - 1美元;$我+ +){
  appendControllerName美元。=函数($ controllerArray [$ i])。& # 39;\ \ & # 39;;
  }
  appendControllerName美元。=ucfirst ($ controllerArray [(controllerLength - 1美元)]);
  }//$控制器=& # 39;\ \ app \ \ saas控制器\ \ \ \ & # 39;。请求()→控制器();
  $控制器=& # 39;\ \ app \ \ saas控制器\ \ \ \ & # 39;。appendControllerName美元;
  verion美元=()→请求参数(& # 39;版本# 39;);
  $ init_service=function()使用(控制器,verion美元,美元params) {//转储(控制器);//$控制器=& # 39;saas \ app \ \测试控制器\ \测试# 39;;
  (反射=new \ ReflectionClass美元控制器);
  
  如果(property_exists($控制器,& # 39;版本# 39;)
  ,,收取(反射→美元getStaticProperties()(& # 39;版本# 39;][$ verion])
  ){//默认规则返回,在前在后不允许返回其他信息
  服务=反射→美元getStaticProperties()(& # 39;版本# 39;][$ verion];//判断控制器服务文件是否存在
  返回class_exists(服务)美元?新服务美元($ params[& # 39;标签# 39;],美元params[& # 39;请求# 39;]):Merror: getInstance ()→jsonApi (40006);
  其他}{
  Merror: getInstance ()→jsonApi (40001);
  }
  };
  
  返回is_null (verion美元)?Merror: getInstance ()→jsonApi(40002):美元init_service ();
  }

PHP接口版本如何控制兼容多端接口