|
第一次原创技术文章……先感慨一下
原来做项目一直是使用wordpress框架,感觉省事,而且需要考虑的东西少之又少。但是在深入开发时就发现,wordpress太庞大了,不适合做更多扩展,于是现在转战敏捷PHP框架CodeIgniter。
做多平台合作开发时使用的是wordpress的xml-rpc支持,功能挺完善,而且是标准的xml-rpc,所以手机端向web端请求一直是以这个标准打包,但是现在使用CI后发现,它虽然支持xmlrpc,但是根本不解析wp下的xml请求,这样如果放弃WP方式,就可能导致手机端代码重编,所以只好想办法解决这个问题。看CI代码看的头疼,图省事直接移植WP的xmlrpc包。
CI版本是2.0,WP版本是3.2.1,首先将WP的class-IXR.php改名叫IXR_Server.php(这个因为CI的类需要像JAVA那样,主类和文件同名),然后将其直接拷贝到application/libraries下,留待使用。
接下来就是关键了,要调用IXR_Server中的函数,必须得将它实例化,使用CI的方式为:
PHP复制代码 $this->load->library('IXR_Server'); 复制代码
但是这样做是不成功的,因为在此之前还没有将methods导入,接下来就有两种方式了,一种是直接在这里传递参数,直接实例化,但是其函数的实现就必须写在IXR_Server里,简洁性和扩展性非常差。令一种方式就是,先创建一个类继承IXR_Server,然后在它里面实现函数扩展,再通过load实例化这个类,这样就可以不用修改IXR_Server中的代码,等WP升级的时候,可以直接COPY更新~
application/libraries/Xmlrpc_Methods.php代码如下:
PHP复制代码 <?php
require_once 'IXR_Server.php';
class Xmlrpc_Methods extends IXR_Server {
var $methods;
function __construct () {
$this->methods = array ('hello' => 'this:sayhello', 'addTwo' => 'this:addTwo' );
parent ::__construct ( $this->methods );
}
function sayhello () {
return "Hello";
}
function addTwo ($args) {
return $args [0] + $args [1];
}
}
?> 复制代码
application/controller/Xmlrpc.php代码如下:
PHP复制代码 <?php
class Xmlrpc extends CI_Controller {
function __construct (){
parent ::__construct ();
}
function index ()
{
//获取传入的内容
if ( !isset( $HTTP_RAW_POST_DATA ) ) {
$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
}
if ( isset($HTTP_RAW_POST_DATA) )
$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
$this->load->library('Xmlrpc_Methods');
}
}
?> 复制代码
然后在XML的rpc_url填写controller的xmlrpc调用就好,如果改过路由的可以参考我的:
PHP复制代码 $rpc_url = "http://localhost/CodeIgniter/Xmlrpc"; 复制代码
这样就大功告成啦!
其实挺简单,但是对PHP的面向对象不是非常了解,所以其中有些东西改了好几个小时……可见基础知识还是要扎实啊…… |
评分
-
查看全部评分
|