php专区

 首页 > php专区 > PHP基础 > 简介 > 论PHP接口版本控制【兼容多端接口】

论PHP接口版本控制【兼容多端接口】

分享到:
【字体:

首先在控制器入口层写一个基类控制器,后续所有的控制器都将会继承该类,在构造函数中调取行为类中的解析服务层代码,将服务层类初始化给基类变量!

    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 controller();
        $cOntroller=  '\app\saas\controller\' . $appendControllerName;
        $verion = request()->param('version');
        $init_service = function () use ($controller, $verion, $params) {
            // dump($controller);
            // $cOntroller= 'appsaascontrollertestTest';
            $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' => appsaasservicessyscenterSysorder::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社区 其它相关文章!


分享到:
个人对命名空间的一点理解
比如说,一个类名是UserInformationCenter,假如命名空间在 App\Controller\,那么使用时,要写 App\Controller\UserInformationCenter ,不利于可读性,因此可以加一个简短的别名,App\Controller\UserInformationCenter as UIC;# 使用示例namespace my\name; //声明一个命名空间,下面的代码属于这个命名空间内class MyC...
linux与windows下安装ImageMagick及phpim...
推荐:《PHP视频教程》 首先要安装两个东西,一个是ImageMagick,另一个是PHP扩展imagick Linux安装 先安装ImageMagick 下载ImageMagick安装包 wget http://www.imagemagick.org/download/ImageMagick.tar.gz 解压tar -xvfz ImageMagick.tar.gz 进入目录cd ImageMagick-7.0.10-28 设置安装路径.后面安装php扩展需要用到;...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……