手机竞拍接口原型框架
历时一周的手机竞拍接口正式完成了,刚开始规划的时候感觉不可能,但事实上就是这么快,主要是很多接口都是复制以前的接口就能搞定。一个项目完了总结一下是很有必要的。
首先这次开发的整个结构沿溪了竞拍web站的风格,遵循统一入口,全面向对象开发。与web站不同的是采用了统一输出,废除了php反射,添加了插件模块,增加调试信息。整个网站结构很清晰。
index.php?cid=10201&format=xml&charset=gbk; 这个是接口的入口,页面只有两句代码:
1 2 3 | include(_BASE_ROOT_.'/config.php'); $index = getInstance(); $index->run(); |
在config.php页面中主要是做参数配置和得到一个相应处理类实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | define('VERSION', 'v0.1'); //接口版本 define('DEBUG', 1); //是否开启调试 $GLOBALS['comonArgs'] = array('cid', 'tid'); //通用接受参数 //通用插件,即所有接口都会调用 $GLOBALS['comonPlugin'] = array('before' => array('refuseSomeUser'), 'after' => array()); //命令调用配置,不同的命令对应不同的处理方法 //可以配置是否验证签名,验证登陆,开启插件等 $GLOBALS['classConfig'] = array( '10011' => array('class' => 'User', 'method' => 'login', 'checkSign' => 1, 'isLogin' => 0, 'args' => array('username', userpwd), 'before' => array()); //传入参数格式检查配置 $GLOBALS['paraConfig'] = array( 'username' => ''); //错误码配置 $GLOBALS['errorConfig'] = array( -200 => '登陆失败'); |
最后还有一个最关键的函数,返回相应类的实例。
1 2 3 4 5 6 7 8 9 10 11 12 | function getInstance(){ $classConfig = $GLOBALS['classConfig']; $cid = request('cid'); $classFile = _BASE_ROOT_.'/Interface/'.$classConfig[$cid]['class'].'.php'; include($classFile); $className = 'I_'.$classConfig[$cid]['class']; if(class_exists($className)){ return new $className($classConfig[$cid]); } } |
前端请求页面就这些,来看看类文件吧,当然还有个主干页面Icom.php页面还没上呢,这个是页面通用继承类,是所有类的爸爸,既然是长辈肯定要为子女做很多事情了,比如帮他们登陆,帮他们过滤坏人(注入),帮他们规划(统一输出)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Icom{ function __construct($data){ $this->_conf = $data; //传入配置数据 $this->_filterArgs(); //过滤get、post、request变量 $this->_initSystem(); //初始化系统配置 $this->_checkLogin(); //根据配置是否要求登陆并完成登陆操作 $this->_checkAuth(); //检查权限,如是否黑名单等。 } function run(){ $plugin = new I_Plugin($this->_conf, $this->_REQUEST); $plugin->runBefore(); //调用前置插件 $action = $this->_conf['method']; $res = $this->$action(); I_Format::result($res, $this->format, $this->charset, $this->_request('debug'), $this->_debugStr()); $plugin->runAfter(); //调用结束插件 } } |
还有I_Plugin和I_Format类就不多说了,I_Plugin负责找出配置中的所有配置插件,并执行。I_Format类就做统一格式化,一般分json和xml,xml又提供了两种,一种是调用DOMDocument类创建,一种是字符串拼接,当然我们选择了后者,因为性能。
最想说的是这个插件问题,因为在开发时,发现以前的web竞拍中有大量的判断代码,如内侧资格判断,活动资格判断等等。活动或内侧过期了,那么这里就有一段长长的注释代码,看着人很揪心。所以在开发时加入插件模块,所有的非功能性代码全以插件函数形式加载执行。
在这次的run函数中没有使用ReflectionClass($this)来反射需要执行的方法,这也是出于性能的因素考虑。不仅代码简单,更重要是更容易理解。
框架写多了能总结很多,以前写mvc框架的时候接触php反射,所以在web竞拍中就使用上了,当时的模块类中必须有配置代码,现在完全剔除了,给开发者减轻了很多工作量,他们只需要关心功能代码。这次总共14个接口,我自己写了注册、登入、登出、购买拍点、购买拍品、出价6个接口;刘雪飞写了用户相关4个接口;小郭写了竞拍相关4个接口。特别说一下小郭和liuxf之前都没有参加过竞拍开发。特别谢谢,你们的努力大大缩短了开发时间。
之前做的订制邮件今天下午已经把所有彩种都上了。一下子感觉轻松了很多,本身花不了很多时间,qianqian催的人心咕咕的,现在上完就好了。电信短信网关也上线了,但是response的有点慢,接下来是联通短信网关开发。

2011/03/07 于 06:04:22
技术呀,学习中