面向对象的PHP开发框架FCS_第1页
面向对象的PHP开发框架FCS_第2页
面向对象的PHP开发框架FCS_第3页
面向对象的PHP开发框架FCS_第4页
面向对象的PHP开发框架FCS_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 Fast , Compatible & Simple OO PHP Framework 简明教程Fast,Compatible & Simple OO PHP Framework Simple Tutorial面向对象的PHP开发框架FCS简明教程(未完成版)版 本 号0.8.0提交单位世纪流年作 者刘晨 <流年>. . . . . . . . . . . . . . . . . . . . . . . . . . . . 联系方式Liu21st at 完成日期2006年8月1日文档版本Rev.1.2第1部分 版权信息发布本资料须遵守开放出版许可协议 1.0 或者

2、更新版本。未经版权所有者明确授权,禁止发行本文档及其被实质上修改的版本。 未经版权所有者事先授权,禁止将此作品及其衍生作品以标准(纸质)书籍形式发行。 如果有兴趣再发行或再版本手册的全部或部分内容,不论修改过与否,或者有任何问题,请联系版权所有者 liu21stat。 对FCS有任何疑问或者建议,请进入FCS讨论组 发布相关讨论。并在此感谢FCS讨论组的所有成员。有关FCS项目及本文档的最新资料,请及时访问作者网站 世纪流年 或者 FCS项目主站 。文档规范约定:请注意文档中相关信息提示以及各自代表的含义 表示提示信息 表示需要注意的事项 词语解释 给出的友好提示 可能存在的BUG 需要引起注

3、意,否则会导致问题 错误的操作目录第1部分版权信息2第2部分FCS概述4第3部分系统基类库11第4部分项目配置15第5部分数据模型定义22第6部分控制器定义25第7部分定义业务逻辑30第8部分模板定义35第9部分过滤器43第10部分认证委托和决策访问45第11部分异常、错误处理和调试51第12部分JS类库55第2部分 FCS概述一、FCS是什么简单的说,FCS是一个快速、兼容而且简单的面向对象的轻量级PHP开发框架,全称是 Fast,Compatible & Simple OO PHP Framework。FCS是一个开源的PHP框架, FCS框架是为了简化企业级应用开发而诞生的。使用

4、FCS,你可以更方便和快捷的开发和部署应用,当然不仅仅是企业级应用,任何PHP应用开发都可以从FCS的简单、兼容和快速的特性中受益。简洁、快速和实用是FCS发展秉承的宗旨,为此FCS会不断吸收和融入更好的技术以保证其新鲜和活力!注意:有一个非常混淆的概念来自FCS命名本身,尤其是熟悉Flash开发的人员,因为很多人都知道之前的Micromedia有个服务器端产品叫做Flash Commucition Server(现在已经更名为FMS),其缩写名也是FCS,并且由于我的Blog早期有很多资料都是关于这个FCS的,因此误以为我的FCS框架便是这个。我之所以把我的PHP框架命名为FCS,除了单词语

5、义缩写吻合之外,对于FCS的情结也是一个重要原因。(见我的Blog上面Fast, Compatible & Simple 我的FCS情结一文)。FCS的特性主要体现在:轻量级从框架文件大小和系统负荷上面来说FCS都算是轻量级的,整个FCS框架可以打成一个不到1M的压缩文件(在FCS发布早期测试版本的时候,曾经有人把FCS比喻成袖珍型PHP框架,因为那个时候的FCS框架还不到50K),而且FCS框架无需安装,对系统的处理开支也非常小。兼容性很多框架并没有考虑PHP4的实现,但是有很多原因我们依然希望在PHP4上面做应用,FCS很好的实现了这一点,并且模拟了一些PHP5具备的优秀特性。容器

6、FCS系统把整个网站应用封装到一个WEB容器中,该容器的访问入口是唯一的,找不到任何另外一个可以访问该应用的入口(在某种部署方式下即使是可以访问的,但是也不能开启应用),容器有一个后台端口,连接数据库进行数据交互,该容器本身由各类业务模型和视图、应用控制器组成。容器中有很多配置文件或者定义文件组成,他们使得应用开发更灵活。框架FCS更是一个框架,系统的调用过程和类库架构图如下所示:二、系统特性FCS框架包含很多特性,包括对OO-RDMS Mapping 、编码转换和UTF-8支持、XML模板引擎、动态数据缓存、多项目的支持以及对企业级开发和部署的支持。并且在可维护性、安全性、可移值性以及可扩展

7、性方面都有很好的表现。只有在使用FCS进行项目开发过程中才能充分体会到FCS的更多特性。面向对象和MVC模式面向对象是FCS框架的实现基调,除了个别必须的公共方法之外(比较频繁使用的方法,为了调用简单考虑),框架的全部文件都采用类的形式实现,为以后的维护和扩展带来了方便。整个应用系统采用单一入口方式访问,其它组件和类库被有效的封装到一个安全的地方,甚至无法通过WEB浏览器访问到,只有入口程序和模板文件在WEB目录下面。因为采用了面向对象的开发方式,FCS系统的可维护性、可扩展性和可移植性方面表现都非常出色。和很多应用框架一样,FCS也采用了MVC模式,但是在实际过程中,做了些调整,控制器由应用

8、控制器和Action控制器类(和App并无继承关系)构成,Dao和Vo类库实现了模型,模板则实现了视图的概念。并且系统的控制部分和模型部分被更安全地封装起来,放到WEB无法访问的路径下面。命名空间和国际化支持FCS的所有类库引用采用命名空间的方式,以保证类库的唯一性。在应用开发的时候不需要使用传统的include 或者require 指令,取而代之的是使用 import方法(为了考虑.Net的开发人员,另外Import方法还有个别名using),import方法导入的根目录是系统的类库目录 LIB_DIR。只要遵循命名规范,类库的导入和使用就显得方便有效,如Import(“FCS.util.L

9、istIterator”);Import(“com.liu21st.index.Vo.UserVo”);Import方法支持多个文件引入和子目录引入Import(“com.liu21st.index.Vo.*”);Import(“com.liu21st.index.* ”); 但是系统不推荐使用子目录引入的方式,因为如果目录下面文件较多会给系统带来较大的目录遍历开销。注意:在Unix或者Linux主机下面是区别大小写的,所以在使用import方法或者using方法的时候要注意目录名和类库名称的大小写,否则会引入文件失败。由于命名空间设计的局限性,在命名目录名称的时候不能使用 “.” 符号,否则

10、会转换成 “/” 符号导致文件引入失败。系统对国际化的支持比较良好,支持语言包功能,您可以定制你需要的语言提示信息。系统在启动应用的时候会检查当前用户的浏览器接受的语言,并会尝试在语言文件目录下面寻找该语言包定义文件,如果不存在则会采用默认的语言文件。在检查到正确的语言后,系统会调用setlocale方法设置本地化支持(包括对时间、数字和货币的本地化支持)。系统默认语言是简体中文,语言文件采用常量定义,您可以方便地扩展其它语言包文件。Lang目录下面的语言文件属于系统语言包,如果您的项目也需要定义语言包,请在Lang目录下面建立相应的项目名称(APP_NAME)目录,并放置相应的语言包文件。兼

11、容PHP4和PHP5这是FCS框架最主要的特色之一,FCS框架的实现是和环境和数据库无关的。系统在实现的过程中充分考虑了PHP4的环境(要求的PHP版本是4.3.0以上),并且在不牺牲性能的前提下模拟的部分PHP5的实现方法,最大程度地保证了系统在运行过程中在PHP4下表现出的出色性能和在PHP5下优势的充分发挥。由于先天的缺陷,PHP4的面向对象机制不够完善,很多只有PHP5才能完成的面向对象特色如Interface、访问控制、Abstract、Final等在PHP4下无法运行,但是在有可能的情况下在其它方面作出了一定程度的PHP5特性模拟。首先在FCS框架的基类Base类中实现了只有PHP

12、5才支持的架构函数_construct()和析构函数_destruct(),并且对PHP5作了更大程度的支持,在PHP5环境下进行应用开发显得更加方便和便捷,例如魔术函数的实现增强了应用开发的容错性和自我完善性。非常明显的一个例子就是在PHP5环境下面,所有FCS基类库的引用都不必手动加载,由_autoLoad()方法自动加载。另外一个情况就是_set()和_get()方法的实现,可以避免在定义数据对象的时候书写枯燥的get和set方法(因为数据对象都是Public的,并且_set()和_get()方法首先判断对象的属性是否存在)。其次,系统模拟了一些PHP4中没有的而又是非常需要的方法和类库

13、,包括property_exists()、array_combine()等方法和ListIterator和ArrayList、HashMap等类库,某些类库是SPL中才有实现。框架的基类库都基于Base扩展,这样充分保证了系统的兼容性。自动编码转换和utf-8支持框架的文件全部采用UTF-8编码格式(为了更好的支持扩展,您以后的应用组件也应该遵循该规范),您可以配置输出的页面编码格式,如gb2312等(默认采用UTF-8输出)。系统根据配置文件中设置的编码格式自动对页面进行编码转换,支持iconv和mb_string两种方式,为了提高效率,如果系统的模板编码设置和输出编码设置项相同,则不会进行

14、编码转换。模板引擎FCS内置了一个性能卓越的模板引擎,是一个使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库,利用该模板引擎可以方便地定义模板文件,从而达到快速开发的目的。FCS内置模板引擎的的模板标签有两种类型:第一种是普通标签,类似于Smarty的模板标签,在功能方面作了部分简化,增强了显示功能,弱化了逻辑控制功能;第二种是XML标签库形式,该模板技术是新版(0.8版本以上才支持)新增的标签技术,有效地借鉴了Java的标签库技术,在控制功能和各方面都比较强大,而且允许自定义标签库,是新版FCS系统引入和推荐的模板标签技术。两种标

15、签方式的结合使用,可以让您的模板定义功能相当强大。FCS架构的设计中模板和程序完全分离,一套模板文件就是一个目录,模板是标准html文件(可以配置成其它后缀,如.shtml,.xml等),可以单独预览。系统会在需要显示的过程中动态加载模板文件,并编译该模板文件,生成一个模板缓存文件,下次会自动检测该模板是否变更过,如果在缓存有效期之内并且模板没有改动过的话,系统就不会再次重新编译模板,而是直接读取编译过的缓存模板文件,编译过的缓存模板文件一旦包含之后就可以直接显示变量的值。所以,缓存模板中的显示内容依然是动态的(除了个别系统特殊变量的输出采用静态输出,因为其值比较稳定),而并不是一个静态的输出

16、,如果您的应用需要采用静态文件输出,请设置启用静态文件功能,系统会读取静态文件输出,并且,还可以设置静态文件的有效期。由于使用了模板动态缓存技术,在您第一次运行某个模块的某个操作时候,对应的模板文件就会被缓存,下次读取的时候,无论是模板文件修改或者是缓存文件被删除,系统都会重新生成缓存文件。你可以设置模板缓存的有效时间间隔,如每隔10分钟重新读取模板文件。模板动态缓存只是让您免去每次重复编译模板的时间,数据的动态缓存在后面有详细的解说。异常和错误处理FCS对异常处理的支持是完全的,无论是在PHP4或者PHP5环境下,您都可以使用Throw_exception方法来抛出异常(默认抛出FcsExc

17、eption异常,你可以指定抛出的异常类型),框架集成了AppException方法和AppError方法来处理异常和错误,如果设置为非调试模式的话,抛出异常和错误的结果是定向到一个指定的错误页面,对于用户来说更友好些。系统的FCSException类是所有异常类的基础类,其它模块的异常处理类应该在该基础类上扩展。该类的实现进行了版本判断,如果在PHP5下面则FCSException类本身也是继承Exception类,否则就实现了一个模拟的异常类,这个要归功于PHP的debug_backtrace方法,是它让异常处理的PHP4实现成为可能。默认Throw_exception方法只能抛出系统异常

18、,如果您要使用Throw_exception方法来抛出自己扩展的异常处理,请添加$type参数来指定需要抛出的异常类型,如:throw_exception(用户信息错误,UserException)。抽象数据库访问层FCS自带的抽象数据库访问层支持多种数据库,并且可以很方便地扩展。目前系统支持的数据库包含有MySQL、MySQLi、PgSQL和Oracle,打算提供支持的还有ODBC等,您可以根据我们的驱动规范来开发自己的数据库驱动类库。通过数据库公共类库Db来访问底层数据库操作,或者可以通过封装的Dao数据访问对象来操作数据库。实现了简单的OO-RDMS Mapping 。充分支持PATHI

19、NFO对搜索引擎友好的充分支持,框架会把所有的GET方式传值转换成PATHINFO形式,并且会把PATHINFO参数转换成GET数组变量,让您可以保持以前的传值和链接形式,转换的工作由框架来完成。您还可以关闭PATHINFO形式,甚至框架还支持你对PATHINFO地址的自定义格式,让你的URL地址富有创造性;系统支持多种方式的PATHINFO地址,您可以根据应用的要求灵活地选用何种方式。普通模式:?m=moudule&a=action&id=2第一种:/m,module/a,action/id,2/ 第二种:/m=module,a=action,id=2/ 第三种:/modul

20、e/action/id/2 系统默认采用第三种方式(FCS0.7以上版本默认)。还可以设置不同的分割符,例如:把PATH_DEPR的值设置为 : 那么您的URL看起来会象下面的效果http:/<serverIp>/var1:val1/var2:val2/var3:val3/PATHINFO技术对以往的编程方式没有影响,因为GET 和POST方式传值依然有效,因为系统对PATHINFO 方式是自动处理,会把类似 ?m=moudule&a=action&id=2 的URL地址重新转换为/module/action/id/2 或者你设置的格式。不同的是在由于因为模拟了目录

21、,所以在模板页面中对当前目录下面的连接处理不当可能会导致失效。如果你的系统不支持PATHINFO方式,或者你依然不打算采用PATHINFO方式,那么可以在项目配置文件中把URL_MODEL的值设置为0就可以使用传统模式了。系统日志和调试实现了简单的日志记录类,通过Log:Write($errorStr) 方法来记录系统日志,包括系统异常和错误信息,您可以随时查看日志文件。日志文件分为SystemErr.log 和 SystemOut.log 。前者主要用于记录系统异常,通常为抛出异常或者捕获严重错误后自动记录,后者主要用于调试信息和页面的一些非严重错误记录,调试信息一般为systemOut方法

22、写入。在系统的调试模式中,可以很方便在在错误调试页面跟踪错误,系统的所有异常和错误都会记录到系统日志中,在应用实施后,您可以关闭调试模式,这样系统就不会自动完成日志记录,除非你自己触发日志写入。 系统对每个项目单独记录日志,所以查看的时候请注意定位到某个项目目录下。如果您的应用组件需要记录特殊的日志,也可以调用(或者扩展)该方法来完成。项目部署和协作开发FCS框架为企业级的部署和开发提供了方便。 首先,FCS框架无需安装,仅仅需要上传就可以了,而且支持PHP4和PHP5,为了做到框架的通用性,在系统的核心设计上基本上没有使用特殊的函数和类库(因为某些特殊需要个别地方对PHP4不支持的函数作了模

23、拟实现),并作了一定程度的PHP5模拟,让框架在PHP4下没有牺牲太多的性能,而且运行顺畅。FCS系统目录可以传到服务器的任何位置,例如 C:/FCS 或者 /User/Local/FCSWebApps目录传到你需要访问的WEB目录下面,由于FCS系统的架构特点,如果你有多个网站应用系统基于FCS框架构建,那么你不需要设置多个网站目录,因为每个网站应用都采用单一入口(也就是说一个网站就只有一个入口文件,模板目录也是公用的,而且并不会相互影响),当然,由于其它原因(如由于不同域名的关系或者要放到不同的服务器)您仍然可以分开多个目录存放,这个并没有影响。其次,系统无需任何配置修改就可以运行,让你的

24、应用部署更加简单,当然,作适当的满足你需要的调整,可以让应用变得更实际。框架是简单的,但是可以构建复杂的应用。新版的FCS框架把系统目录和网站目录分离,完全可以做到更安全的部署应用,您可以把FCS系统目录放到非WEB访问目录下面,以保障应用的代码安全。新版类库的设计更加满足企业级应用开发中的协作和分布式开发的需要。每个项目、每个模块都独立目录,可以达到方便地集成。网站目录下面只有应用的首页文件,而且其中并没有任何业务逻辑处理,纯粹是系统应用的调用和初始化。也会项目的迁移提供了便利。不同应用项目的应用类库放在FCS系统目录的Lib目录下面Lib目录下面的FCS目录为基类库,可供各个项目调用。每个

25、应用项目可以在Lib目录建立相应的命名空间,如:com.liu21st.App1、Com.liu21st.App2(实际的文件存放可能就是在Lib目录下面的com/liu21st/App1和com/liu21st/App2。)各个项目的类库之间也可以相互调用,如:Import (“com.liu21st.App1.Dao.UserDao”)Import (“com.liu21st.App2.Umon”)这样做的目的是为了防止项目之间的冲突,当然你或许想直接用项目名称来区分不同的项目,那么也没有问题,只要项目没有重名,你可以使用App1、App2的方式。Import (“App1.Dao.Use

26、rDao”)Import (“App2.Umon”)FCS支持分布式的开发和团队合作开发,体现在可以实现项目分布开发和模块分布开发,对于调试工作没有影响,最后项目整体完成后再统一集成。每个项目包是一个独立的目录,项目包下面的每个模块又相互独立,因此,协作和集成都很容易完成。每台开发服务器上面只要有FCS框架本身的基类库和框架文件就可以进行应用开发和测试工作。基于FCS框架进行应用开发,开发人员只需要关注应用类库,所有的后台编码全部都集中(并且大部分情况下只有)在应用类库上面,在进行测试的时候需要模板文件的配合,模板文件的制作参考后面的模板指南。开发过程中涉及到的应用类库有几种区别,详细参考后面

27、的开发指南。同时,FCS框架还为同时并发多个项目提供了良好的支持,主要表现在:每个项目分配不同的入口文件,容易部署;每个项目有单独的配置文件,相互独立,互不影响;每个项目的缓存文件和静态文件相互独立,更改和调试互不影响;每个项目可以单独定制各自的语言包,不会冲突;每个项目有独立的类库目录,分工协作更加方便;每个项目的系统日志有单独目录,互不影响;三、目录结构FCS框架除了模板目录和网站入口文件必须放到WEB目录下之外,其它所有框架的文件和目录可以单独存放,不受限制,您需要做的仅仅是在首页文件中指定FCS框架的包含目录,我们建议您如果可能的话把FCS框架的目录包放到其它网站不能访问的目录下面,以

28、保障应用的安全性。下面是FCS框架包含的目录结构: WebApps 网站应用目录 index.php 首页文件 Tpl 模板目录 FCS 系统框架目录 ( 和网站目录可以分离 ) FCS.php 框架公共文件 Common 公共文件目录 (存放一些公共函数、定义文件等) Cache 系统缓存目录 Html 静态文件目录 (新版静态文件无需放在web目录下面了) Conf 配置文件目录 (存放系统配置和项目配置文件) Docs 文档目录 Lang 语言文件目录 Lib 类库文件目录 (存放基类库和应用类库) Tags 标签库文件目录 Logs 日志文件目录 Temp 临时文件目录(存放缓存数据)

29、 Uploads 上传文件目录 PlugIn 插件文件目录第3部分 系统基类库四、系统基类库FCS框架通过基类库的概念把所有系统类库都集成在一起,包括FCS的核心类库(但是不包括系统函数在内)。基类库的作用是完成框架的通用性开发而必须的基础类和一些为了满足不同的应用需求而增加的工具类等,理解FCS基类库对使用FCS进行应用开发和部署很有帮助。目前包含的类库集有:FCS.Core 核心类库包FCS.Db 数据库类库包FCS.Util 工具类库包FCS.Exception 异常处理类库包FCS框架中引用基类库和应用类库的方式采用命名空间引用方式(当然,如果你愿意一样可以通过include或者req

30、uire方式包含类库文件,不过那样的话也许更加麻烦),系统集成了Import方法来引用类库文件(包括系统基类库和应用类库)。import方法有四个参数,除了第一个参数外,其它都是可选。$class 要导入的类库命名空间名称$baseUrl 根目录,默认是Lib(系统配置中的LIB_DIR项)目录$ext 要导入的文件扩展名 默认是 '.class.php'$subdir 采用*方式导入的时候是否导入子目录中的文件 默认为false假如要引入 Lib/FCS/util/下面的HashMap类,可以通过使用1. Import (“FCS.util.HashMap”)

31、60; 来方便地引入该类或者使用 1. Import (“FCS.util.* ”)  来引入util目录下面的所有类库。整个FCS基类库会不断的完善和扩展,将来也许不止这些包,该类库的更新由FCS系统来完成,无需用户进行扩展。用户的应用级别的扩展可以放到项目的工具包中。当然,如果你有兴趣并且有足够的能力可以进行其它基类库的扩展,如IBM.core IBM.util 等类似的扩展下面简单介绍下基类库中主要类库核心类库核心类库是FCS框架运行的必须条件,其中还包括了重要的Base类。Base类作为FCS系统的基类,在兼容性的实现方面作了很大工作。1、支持事务和回滚(

32、当然首先需要数据库本身支持),但是默认是自动提交2、在数据库调试模式下支持SQL语句的输出3、完全支持中文UTF-8字符集4、把查询操作和执行操作分开,便于返回不同的结果5、支持配置文件和DSN两种数据库配置读取方式6、支持对数据集的数组和对象两种方式返回7、记录数据库查询次数和执行(写入)次数数据库类库中最重要就是公共类Db的实现,除了引导各种数据库驱动之外,它还提供了数据库抽象访问的一些基本方法,包括CURD的SQL指令的抽象访问。查询的结果返回数据集对象ResultSet,而Dao对象把查询的数据集从数据集对象又转换成了Vo对象或者VoList对象。最终的目的是为了让应用操作数据库更加方

33、便有效。你还可以方便地增加自己需要的数据库驱动类库。DB类内置了对数据缓存的支持,缓存数据集可以通过共享内存或者文件方式保存。如果直接用Db类来操作和访问数据库的话,需要在数据集类库ResultSet中获取记录,ResultSet中的记录格式可以通过设置Db类的ResultType变量(0 返回数组 1 返回对象)。可以用getRow($Row)方法来取得某条记录,也可以用getRange ($offset,$length)方法来获取某个范围内的记录。(如果直接通过数据库驱动类库来访问和操作数据库的话,还可以使用next方法和result来获取数据集)。Db类提供了Find、Add、Remov

34、e和Save四个抽象的操作方法。还提供了切换数组和对象返回类型的方法getArrayIterator和getObjectIterator。如果使用Dao对象来操作数据的话,返回的是Vo对象或者VoList对象,针对VoList对象可以使用get方法和range方法(继承父类ArrayList的方法)来分别获取某条记录和一定范围内的记录。工具类库工具类库有很多,主要是提供应用开发时候的基础类库支持,在架构的数据模型实现的时候,用到的比较重要的几个类库是:ListIterator、ArrayList和HashMap。因为ResultSet数据集对象由ListIterator派生而来,Vo对象、Vo

35、List和Dao对象的操作都需要HashMap和ArrayList的支持,而HashMap和ArrayList和也都派生自ListIterator类。工具类库可能是FCS基类库中最庞大的类库,目前实现的大部分是基础类和抽象类,以后可能会添加一些更多的具体类,目的当然是提高应用开发的效率和提高类库的可重用性,让应用开发看起来更加简单。当然,您还可以在应用类库中单独添加自己的工具类库。已有的工具类列表:ArrayList ArrayObject 数组对象类Config 配置管理类 包含相关的配置实现类DirectoryIterator 目录遍历FileIterator 文件遍历HashMap Ha

36、shMapHttp http相关类Image 图像类ListIterator 迭代实现类Log 日志处理类Page 分页类SharedMemory 共享内存管理类 包含相关的实现类Stack 堆栈实现类TagLib 标签库管理类 包含相关的实现类UploadFile 文件上传类Validation 数据验证类 异常处理类库系统的异常处理都派生自 FCSException基础类,暂时系统并没有扩展其它异常类型,因为兼容性的需要,所以无法判断要抛出的异常类型,但是在进行应用开发的时候,可以扩展模块的异常处理,在模块内出错均抛出该模块的异常即可。也可以直接抛出系统异常。由于照顾到PHP4的异常处理问

37、题,所以,系统统一使用throw_exception方法来手动抛出异常。因此请根据你的项目要求来使用不同的异常处理方式。而且throw_exception默认只能抛出系统的异常,如果你扩展了某个异常处理类,需要在throw_exception方法中抛出,请使用$type参数来指定要抛出的异常类型(异常处理类的名称)或者添加单独的抛出异常方法。例如,抛出UserException异常的方法1. throw_exception(用户信息错误,UserException); 第4部分 项目配置基于FCS框架的应用开发过程大致有下面几个过程:1.项目配置和定义2.数据模型和业务访问逻辑(模型)定义3.

38、模块和操作(控制器)定义4.模板(视图)定义5.项目部署当然,每个过程中还涉及到一些不同的方面,后面会一一详细讲述。五、项目配置FCS框架不需要安装,但是在使用FCS进行应用开发之前可能需要进行一些项目配置。使用FCS框架进行开发的主要工作是在应用类库的开发上面,在此之前你需要完成一些基本项目配置,包括项目入口文件定义、配置文件定义。当你规划好了一个项目之后,第一个工作是完成项目入口文件,因为FCS框架采用单一入口模式部署,所以一个项目只有一个入口,除非你指定了多个入口。项目入口文件的标准写法是:例如 入口文件MyApp.php/ 定义FCS框架路径和网站路径 使用绝对路径

39、define('FCS_PATH', 'f:FCS');define('WEB_ROOT', dirname(_FILE_);/定义项目名称,如果不定义,默认为入口文件名define('APP_NAME', 'MyApp');/ 加载FCS框架公共入口文件 require(FCS_PATH.'/FCS.php');/实例化一个网站应用实例$App = App:getInstance(); $App->init();

40、$App->exec(); 其中三个定义都不是必须的,FCS_PATH用于定位定位FCS框架,如果在你的php.ini文件中的include_path路径中添加FCS的系统目录,那么都可以无需定义。WEB_ROOT 可以在项目配置文件中定义,APP_NAME如果不定义,默认为入口文件名。下来就是实例化一个App应用类,并且执行初始化和运行操作。无论你的应用有多复杂,入口文件都是这么简单如果你有多个项目要使用FCS框架,只需要定义多个入口文件就行了,注意项目名称不能重复。入口文件定义完成后,就需要针对每个项目定义配置文件了。FCS框架的系统配置文件采用常量定义文件,位置在FCS框架下面Co

41、mmon目录的defines.php,该配置用户无需修改,除非你要修改FCS框架的目录结构。你需要定义的只是各个项目配置文件。项目配置文件的路径在FCS框架系统下面的Conf目录下面。你应当在该目录下面给每个项目建立一个以项目名称命名的子目录,例如给MyApp项目建立一个MyApp子目录(注意大小写,为了在Linux系统下面运行正常)。项目配置文件的格式支持很多类型,目前支持的有PHP数组、常量定义文件、INI配置文件、XML配置文件和PHP对象,项目配置文件统一使用App作为文件名,后缀根据格式而不同。如果项目配置目录下面存在多个配置文件,则系统会按照目录遍历方式取得第一个配置文件,不管以何

42、种方式进行配置定义,系统在读取配置文件后会转换为常量定义,并且生成一个默认的appDefine.php的定义文件。系统在第二次运行的时候,就不需要重新解析配置文件,而是直接载入生成的项目定义文件。项目配置文件主要包含下面参数定义:(以后可能会有增加,以项目提供的配置说明为准)/* 配置文件定义*/模板目录名define('TMPL_DIR','Tpl'); /模板所在路径define('TMPL_PATH','F:wwwFCSTpl'); /应用类所在路径define('APPS_PATH','f:FCSL

43、ib'); /应用程序模式 1 普通模式 2 高级模式define('APP_LEVEL',1); /是否为调试模式 define('DEBUG_MODE',true); /是否记录日志文件define('WEB_LOG_RECORD',true); /日志文件大小限制define('LOG_FILE_SIZE',2097152); /非调试模式的错误定义页面define('ERROR_PAGE',''); /错误信息define('ERROR_MESSAGE','你

44、浏览的页面暂时发生了错误,请稍候再试!'); /URL访问模式 0 普通模式 1 PATHINFO模式 2 REWRITE模式define('URL_MODEL',1); /PATHINFO参数方式/1 /m,module/a,action/id,2/2 /m=module,a=action,id=2/ /3 /module/action/id/2 新版系统采用方式define('PATH_MODEL',3); /PATHINFO参数和值的分割符号 PATH_MODEL为3时无效define('PATH_DEPR',','

45、); /模块参数变量名 用于PATHINFO到GET方式的转换define('VAR_MODULE','m'); /操作参数变量名define('VAR_ACTION','a'); /模块集参数变量名define('VAR_PART','u'); /文件参数变量名define('VAR_FILE','f'); /默认模块名define('DEFAULT_MODULE','index'); /默认操作名define('DEFAUL

46、T_ACTION','index'); /默认名define('DEFAULT_PART','index'); /默认模板名define('DEFAULT_TEMPLATE','default'); /语言参数名define('VAR_LANGUAGE','l'); /模板参数名define('VAR_TEMPLATE','t'); /默认语言define('DEFAULT_LANGUAGE','zh-cn');

47、 /模板字符集define('TEMPLATE_CHARSET','UTF-8'); /默认输出字符集 在输出的时候可以改变define('OUTPUT_CHARSET','utf-8'); /系统时区名define('TIME_ZONE','PRC'); /模板后缀名define('TEMPLATE_SUFFIX','.html'); /模板缓存文件后缀名define('CACHFILE_SUFFIX','.php'); /静态文件后

48、缀名define('HTMLFILE_SUFFIX','.shtml'); /是否启用用户认证define('USER_AUTH_ON',true); /用户认证类型/1 登录认证模式 在登录时候读取权限缓存/2 安全认证模式 即时读取权限define('USER_AUTH_TYPE',1); /用户认证IDdefine('USER_AUTH_KEY','authId'); /认证密码加密方式 留空为不加密define('AUTH_PWD_ENCODER','md5'

49、); /认证委托管理器名define('USER_AUTH_PROVIDER','DaoAuthentictionProvider'); /认证网关define('USER_AUTH_GATEWAY','/public/login'); /无需认证模块 用逗号分割多个define('NOT_AUTH_MODULE','public'); /是否启用页面压缩define('COMPRESS_PAGE',false); /页面压缩方式 define('COMPRESS_METHO

50、D','deflate'); /页面压缩等级define('COMPRESS_LEVEL',5); /是否启用浏览器缓存define('BROWSER_CACHE',false); /是否启用静态页面缓存define('HTML_CACHE_ON',false); /静态页面缓存时间define('HTML_CACHE_TIME',60000); /是否启用模板缓存define('TMPL_CACHE_ON',true); /模板缓存时间define('TMPL_CACHE_TIME

51、',1000); /是否启用动态数据缓存define('DATA_CACHE_ON',true); /数据缓存时间define('DATA_CACHE_TIME',1); /是否启用共享内存define('USE_SHARE_MEM',true); /默认使用共享内存类型/ 'Eaccelerator' / Eaccelerator (Turck MMcache fork)/ 'Mmcache' / Turck MMCache/ 'Memcache' / Memched/ 'Shmo

52、p' / Shmop/ 'Apc' / APC/ 'Apachenote' / Apache note/ 'Systemv' / System V/ 'Sqlite' / SQLite/ 'File' / Plain text/ 'Sharedance' / Sharedancedefine('SHARE_MEM_TYPE','File'); /分页每页显示记录数define('LIST_NUMBERS',20); /分页每页显示页码数defi

53、ne('PAGE_NUMBERS',5); /分页跳转参数名define('VAR_PAGE','p'); /模板禁用函数列表 用逗号分割define('TMPL_DENY_FUNC_LIST','echo,exit'); /模板标签起始标记define('TMPL_L_DELIM',' '); /模板标签结束标记define('TMPL_R_DELIM',' '); /数据库类型define('DB_TYPE','mysql&

54、#39;); /数据库地址define('DB_HOST','localhost'); /数据库端口define('DB_PORT',''); /数据库名称define('DB_NAME','fmschat'); /数据库用户define('DB_USER','root'); /数据库密码define('DB_PWD',''); /数据库前缀define('DB_PREFIX','fcs'); 系统的配置

55、文件类提供了对多种配置文件格式的转换,可以在系统支持的配置类型之间相互转换。XML配置文件格式,使用小写定义就行,系统在转换为常量定义的时候自动转换为大写。<?xml version='1.0' encoding='utf-8' ?><config><tmpl_dir>Tpl</tmpl_dir></config> PHP数组格式定义<?phpreturn array 'TMPL_DIR' => '

56、Tpl',);?> 第5部分 数据模型定义六、数据模型定义我们之前已经定义了项目入口文件,和对项目进行了相关配置(项目配置可能会贯穿整个开发过程,常常会因为某些原因调整配置参数)。假设我们设计分析阶段,已经设计好数据表结构,那么接下来就是为FCS开发定义数据模型。数据模型的定义很简单,把数据字典中的字段转换为Vo对象的属性来定义就行了。假设有个用户表为CREATE TABLE user (  id int(10) NOT NULL auto_increment,  nam

57、e varchar(30) NOT NULL,  password varchar(32) NOT NULL,  nickname varchar(30) NOT NULL,  status tinyint(1) NOT NULL,  remark varchar(255) default NULL,  PRIMARY KEY 

58、 (id),  UNIQUE KEY name (name)  那么我们把user表转换为Vo对象应该写成:class UserVo extends Vo /类定义开始var $id;                    /用户编号var $name; &#

59、160;            /用户名var $password;       /密码var $nickname;        /昵称var $status;           

60、60; /用户状态var $remark;  /备注信息 /类定义结束 Vo类的文件名和类名同名,例如上面的类文件名应该是 UserVo.class.php,通常放置在项目应用类库目录下面的Vo子目录下面。注意:上面的写法是兼容PHP4的写法,如果你采用PHP5开发,并且不考虑兼容性的话,可以使用public/protected/private 访问控制符号来定义字段属性。严格来说,Vo对象属性并不一定限制为数据表字段,我们可以理解为视图对象,这样Vo的字段就更加灵活了。这里定义的Vo对象的属性应该就是数据库查询的返回字段名,如果进行关联查询的

61、话,属性名可能和真实表字段名有所区别。如果你的数据库支持视图,那么这么这里可以定义为视图中字段名。数据表中字段是不区分大小写的,但是在Vo对象中定义的属性是区分大小写的,这点尤其要注意。要初始化一个Vo对象可以使用数组或者Map对象,也可以创建空对象,然后进行属性设置。你不需要为每个对象属性添加存取方法,要获取或者设置Vo对象的属性请使用get和set方法,这两个方法调用了Base基类的_get和_set方法。Vo对象有三个转换方法可以转换成其他类型toArray 转换成数组toMap 转换成Map对象toJson 转换成Json字串可以使用isEmpty方法判断一个Vo对象是否为空。在FCS开发模型中默认的数据表主键命名统一使用id,并且使用自动增长类型,如果和你的数据库设计不符,在使用Dao类的时候需要设置参数。另外一个高级技巧是可以为多个Vo对象定义父类,那么通过相关设置,你可以做到更新子对象的同时可以更新父对象。例如,为网站的所有类型的用户定义一个UserVo对象,其中包括了所有类型用户所公共的属性,各类型的私有属性可以定义在自己的Vo对象中,如下面的会员

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论