基于ThinkPHP 的Api 设计

358 查看

前言

关于Api的设计目前比较流行的是 restful 风格的Api设计,譬如阮一峰的这篇RESTful API 设计指南中的介绍,PHP也有很多支持 restful风格的框架,具体请自己 谷歌之~.但是实际开发中 很对公司采用的并不是支持 restful风格的框架,而且是ThinkPHP~,在实际的开发过程中,接口分为不同的版本~V1.V2.V3...

ThinkPHP 实现接口管理

  1. 按照ThinkPHP官网教程 搭建项目.配置默认分组为 Rest,在Rest分组下创建 ApiController.class.php文件和BaseController.class.php文件,文件内容大概如下

ApiController.class.php
<?php
    namespace Rest\Controller;
    class ApiController extends BaseController {
        
        protected $method;
         
        protected function _validate_Signature () { //验证参数
            
        }
        
        public function index () {
           
            $parm = I();
            //验证访问权限 和 参数
            
            $ret = $this->api_call();
            $this->response($result);
        }
    }
BaseController.class.php
<?php
    namespace Rest\Controller;

    use Think\Controller;
    class BaseController extends Controller {
    
        public function __construct () {
            set_error_handler(array($this,'_error_handler'));
            set_exception_handler(array($this,'_exception_handler'));
            register_shutdown_function(array($this,'_shutdown_handler'));
        }
        
        public function _error_handler || _exception_handler || _shutdown_handler () {
            //文件中分建立三个 该方法,处理 错误 异常和脚本执行完毕
            //其中 _shutdown_handler 可以通过 error_get_last() 获取错误信息
        }
        
       public function api_call ($name) {
           $reqs = I(''); 
           $rt = explode(".", $reqs['method']);
           if(count($rt) != 2)  //抛出异常
           
           $classname = $rt[0];
           $methodname = $rt[1];
           $classname = ucfirst($classname) . 'Class';
           
           //版本控制
           $v = 'Class';
           $version = I('v');
           if ( !$empty($version) ) {
               $v .= '_' . $version;
           }
           //APP_PATH w为ThinkPHP 配置的应用目录
           $file = APP_PATH.'Rest/Controller/'.$V.'/'.$classname.'.php';
           if(!is_file($file)) //抛出异常
           
           require_once ($file);
           
           $reflector = new \ReflectionClass($classname);
           if(!$reflector->hasMethod($methodname)) //抛出异常
           
           $action = $reflector->getMethod($methodname);
           $parameters = $action->getParameters();
           $class = new $classname();
           $method_params = array();
           return $action->invokeArgs($class,$method_params);
       }
    }
  1. 第二步 只需要在 Rest分组下面建立对应的文件夹,如默认的 Class文件,Class_v2,对应不同的Api版本控制,在Class中建立 'UserinfoClass.php'

<?php
    Class Userinfo {
        
        public function echoName () {
            return 'hello world';
        }
    }
  1. 访问接口,假设项目部署在根目录,调用获取用户名接口,即 http://127.0.0.1/rest/api?method=userinfo.echoName&v=2