基于ThinkPHP 与ZendAMF 框架的Flex 开发
2012-09-12林文如
刘 镭,林文如
(1.福建师范大学信息技术学院,福建 福州 350007;2.闽江学院计算机科学系,福建 福州 350108)
从MVC的角度看,Flex只是一个客户端表现层(即View),要真正地实现数据处理,就必须与服务端程序进行交互[1].在Flex中运用ZendAMF框架进行通信的应用研究较少[2].本文将研究和探讨在ThinkPHP中整合ZendAMF框架的方法和实例,为基于Flex的富客户端应用提供数据交互的能力.
1 开发框架简介
ThinkPHP是一个免费开源的、快速简单的、面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷Web应用开发和简化企业应用开发而诞生的,并且集成了许多第三方类库[3].
AMF协议是Adobe公司的Action Message Format协议的简称[4],主要用于数据交互和远程过程调用,在功能上与WebService相当,但AMF与WebService中的XML不同,AMF是二进制数据,而 XML是文本数据,AMF的传输效率比XML高[5].本文所整合的是基于 AMF协议的ZendAMF,该框架在执行效率、稳定性各方面均有较大优势.
Flex是一个高效、免费的开源框架,可用于构建具有表现力的Web应用程序.这些应用程序利用 Adobe Flash Player和 Adobe AIR,运行时跨浏览器、桌面和操作系统,实现一致的部署.
2 开发框架整合
如上所述,ThinkPHP、ZendAMF、Flex三者之间具有各自的优势,那么如何整合3个框架,为企业级应用提供一种敏捷的开发方案,是一个急需解决的技术问题.
2.1 整合思路及方法
ThinkPHP是一个服务端开发框架,封装了CURD和一些常用操作,在查询语言、自动验证、视图模型等方面均有独特的表现,即在设计控制器(Controller)与模型(Model)方面具有很强的处理能力,但富客户端界面视图(View)方面的表现则不尽如人意.
ZendAMF也是一个服务端开发框架,本身并没有处理客户端界面视图方面的能力,但它内置了Flash对象,可以将服务端的Object、Array、Date、XML等数据传回服务器端,在服务器端自动解析成适当的对象,这就减轻了开发人员繁复的工作负担,同时也节省了开发时间.
Flex是一个富客户端开发框架,先天就缺少服务端控制器、模型方面的能力,但在界面视图方面却有独具一面的优势.
整合3个框架的思路是:将3个框架各自的优点抽取出来,分别扮演M(模型)、V(视图)、C(控制器)的角色,即ThinkPHP扮演控制器及模型的角色,ZendAMF扮演控制器网关的角色,Flex扮演视图的角色.
2.2 整合后的开发框架
根据以上分析的结果,整合后的开发框架如图1所示.
图1 框架整合图
如图1所示,整合后的框架使用Flex来代替ThinkPHP的视图(View)部分,Flex负责前端的用户交互,ThinkPHP负责服务端的业务逻辑(Controller)和数据处理(Model),ZendAMF的AMF网关负责架起Flex与ThinkPHP之间通信的桥梁,通信的方式为Remote Object.用Remote Object格式来传递数据,适用于大数据量通信的PRC服务.
框架的操作流程为:Flex客户端通过ZendAMF网关向ThinkPHP控制器发送请求,Think-PHP控制器根据接收到的请求命令向ThinkPHP模型发送数据处理指令,ThinkPHP模型通过ThinkPHP内置的数据库接口向数据库请求数据,数据库返回的数据通过上述路线原路返回给Flex客户端界面.
3 应用实例
3.1 实例概述
为了简明扼要地介绍3种框架整合技术的实现,又不失一般性,本实例将实现一个简单的留言板功能模块,包括写留言、查看留言2项操作.
3.2 开发环境
在Windows平台下,使用如下开发环境:Apache 2.2.17+PHP5.3.3+MySQL5.5.8+ThinkPHP2.1+ZendAMF 1.1.1+ZendStudio 9.0.1+Adobe Flash Builder 4.5.
3.3 实例实现
数据库设计:在MySQL数据库中新建一个表guestbook,包括 3 个字段:id、title、content.
在ZendStudio中新建一个本地PHP项目guestbook,系统自动在web服务器的根目录下建立一个guestbook文件夹及index.php等文件,将ThinkPHP框架目录复制到guestbook文件夹内,并在项目根目录下新建一个www文件夹.
将ZendAMF框架复制到ThinkPHPVendor目录下(注:ThinkPHP完整版中包含的 Zend-Framework已经包含了 ZendAMF).打开 index.php文件,ThinkPHP的入口文件一般写法如下:
打开浏览器,在浏览器地址栏中输入 http://localhost/guestbook,回车执行,若未提示错误,则表示ThinkPHP框架已经配置成功.在wwwLibAction下新建一个控制器,名为GbAction.class.php的文件,主要代码为:
在wwwLibAction下新建一个控制器,名为 GatewayAction.class.php 的文件,代码如下:
打开浏览器,在浏览器中输入网址http://localhost/guestbook/index.php/Gateway/,回车执行,若浏览器中返回的结果显示“Zend Amf Endpoint”或者提示下载 gateway文件的话,表明ZendAMF配置成功,并且与ThinkPHP整合成功.
在Flash Builder中新建一个Flex项目,在窗口中增加2个Button控件,1个DataGrid控件(id=dg),1个 TextInput控件,1个 TextArea控件.由于篇幅关系,本文只列出“查看全部留言”按钮的实现代码,主要代码如下:
运行结果如图2所示,当点击按钮时,触发请求,通过 ZendAMF的网关,我们成功地用ThinkPHP强大的数据模型功能获得服务器数据,最终返回给Flex显示.
图2 运行界面
4 对比分析
在进行对比分析之前,首先给出传统方法和本文方法的技术简明表,如表1所示.
表1 两种开发方案的技术简明表
针对留言板功能模块,分别使用上述2种方法进行了开发,运行在相同的服务器及客户端环境下,下面将从开发效率、请求响应时间两方面进行对比分析.
4.1 开发效率对比
从表2可以看出,模块代码行与模块开发时间的对比上,本文的方法都明显优于传统的方法.注:代码行的区别主要体现在服务端PHP的代码量.
表2 开发效率对比表
4.2 请求响应时间对比
从表3可以看出,在小数据量方面,两种方法的请求响应时间基本一样,无明显差别.但对于请求大数据的时候,本文方法的请求响应时间明显优于传统的方法.注:请求响应时间包括加载、初始化、执行和模板的响应时间.
表3 请求响应时间对比表
5 结语
综上所述,使用ThinkPHP强大的数据操作和模型的功能,通过ZendAMF的通信,可为Flex提供远程数据调用服务,而Flex强大的富客户端技术又弥补了ThinkPHP中视图(View)的不足.本文的方法综合了3者的优势,为敏捷式企业级应用开发提供了一个较好的技术解决方案.
[1]吴波.Flex异步通信方式的比较[J].广播与电视技术,2012(2):133-138.
[2]徐英钟,陈文竹,张凌霄.基于Flex与PHP的MVC框架整合应用研究[J].计算机光盘软件与应用,2010(4):108-109.
[3]Thinkphp团队.ThinkPHP简介[Z/OL].(2010-03-09)[2012 -05 -07].http://www.thinkphp.cn/about.html,2008.
[4]易学武.Net平台下的AMF开发[J].电脑知识与技术,2010,6(23):6615 -6617,6520.
[5]陈显军,魏祖宽.基于Flex的XML数据通信与应用研究[J].计算机与现代化,2008(3):112-114.