国产的PHP MVC框架:FleaPHP
官方网站:
http://www.fleaphp.org
框架下载:
http://www.fleaphp.org/download
框架API :
http://www.fleaphp.org/docs/api/index.html
开发指南:
http://www.fleaphp.org/guide
框架社区:
http://www.fleaphp.org/community
FleaPHP 并不是心血来潮的结果,而是作者在 Web 开发中不断探索的成果。虽然 FleaPHP 缺乏 Zend Framework 那样巨大的号召力,也没有 CakePHP 和 Symfony 那样庞大的社区。但 FleaPHP 仍然是一个值得你花时间去了解、去学习的框架。
FleaPHP 的设计目标
FleaPHP 致力于减少开发者创建 Web 应用程序的工作量,并降低开发难度和强度,提高开发效率。
-
快速、轻量级,避免臃肿的结构带来的性能损失
由于 PHP 是解释执行,如果花费太多资源在框架本身,显然不适合的。就像一台计算机如果把大量的资源都花在操作系统上了,而应用程序能够得到的资源却少得可怜,显然是无法让用户接受的。
-
可扩展、开放性的架构,允许开发者引入自己的组件或者任何成熟的工具库
框架虽然提供了许多组件,但不可能完全满足用户的需求。因此,框架本身应该是松散耦合、可扩展的。开发者可以很简单的为框架加入新的组件。同时,框架的逐步发展也不应该影响框架的核心基础。 最后,开放性的架构让开发者在框架中引入其他组件或者工具库时不会遇到任何困难。例如开发者可能会使用 Smarty 来做模板引擎,以及 PEAR 中的一些库来简化开发工作。
-
尽可能少的契约,但同时提供足够的自动化能力,减轻开发强度
虽然契约式编程,可以让框架本身的设计变得更简单,开发者也能从框架获得更多的帮助。但太过严格的规则和约定会明显降低框架的适应性,为此需要对两者进行适当的平衡。FleaPHP设计时采用尽可能少的契约,通过更复杂的实现来实现一些自动化能力。或者以最少量的配置信息来帮助框架为开发者提供服务。
-
高度灵活的解决方案,提供开发应用程序的大多数基本组件
虽然现在已经有许许多多出色的工具库可供选择。但对于一些平常的需求来说,这些工具库可能具有过度杀伤能力(也就是说工具库本身提供了远远超过需求的功能)。由此带来了学习难度增大、性能降低等问题。为此,FleaPHP 框架提供了一组轻量级的基本组件。这些组件被设计为拥有基本的功能和可扩展。 例如 FleaPHP 附带的基于角色的权限验证组件虽然不如 phpGACL 这样的库功能强大,但却能够解决平常开发都会遇到的典型权限验证问题,并允许开发者自行扩展这个组件。
FleaPHP 的主要特征
除了 MVC 模式实现、Dispatcher 调度器、模板引擎等常见功能外,FleaPHP 框架还拥有许多独一无二的特点:
-
简单、容易理解的 MVC 模型
不像其他流行的框架,FleaPHP 提供的 MVC 模型注重简单和容易理解。例如 FleaPHP 不要求开发者从特定的类派生自己的控制器类和业务模型类。
-
易于使用、高度自动化的数据库 CRUD 操作
FleaPHP 采用 TableDataGateway 设计模式来封装数据表操作。FLEA_Db_TableDataGateway 类不但提供了容易使用的 CRUD 操作,还实现了数据表之间的关联操作。同时,FleaPHP 没有像其他框架那样将每一行记录都封装为一个对象(毫无疑问这会产生明显的性能问题),而是利用 PHP 强大的数组来保存和传递数据。
-
尽可能少的配置
虽然像数据库联接信息等配置仍然是不可少的,但 FleaPHP 应用程序通常只需要设置几个选项,即可在各种环境中运行良好。而且 FleaPHP 的所有设置都采用 PHP 数组来保存,不但容易理解,而且省掉了解析、缓存等不必要的过程,提高了性能。
-
高度可配置能力
虽然 FleaPHP 自动化程度很高,但 FleaPHP 同时也拥有高度的可配置能力。通过覆盖 FleaPHP 默认的选项,开发者可以获得最大程度的灵活性。让开发者可以在适应现有代码、保持开发习惯等各方面获得好处。
-
自动化的数据验证和转义
即便不做任何处理,程序将数据通过 FLEA_Db_TableDataGateway 提交到数据库前。FleaPHP 也会自动对数据进行验证,并转义特殊字符,最大程度消除 SQL 注入攻击。
-
丰富的助手对象和组件
FleaPHP 附带了一些非常实用的助手对象,从生成图像验证码、处理 文件上传 到通用数据验证等。这些助手对象大多是一些独立的对象,完全不依赖于 FleaPHP 框架本身。因此开发者不但可以在 FleaPHP 之外使用这些助手对象,也可以方便的加入自己的助手对象。 组件是比助手对象更为复杂的可重用单元。这些组件包括基于角色的用户管理、脚手架等。利用这些组件,开发者可以很快的完成一些常见任务,并能在这些组件基础上扩展出功能更复杂的组件。
-
与 Smarty 集成
只需要修改几个选项,FleaPHP 应用程序就可以和流行的 Smarty 模版引擎集成。
-
100% FREE
当然,最后一点就是 FleaPHP 是一个完全开放源代码和文档(不是那种滑稽的删除了所有注释仅能运行的代码)、不限制使用的项目。你可以自由的学习、使用 FleaPHP,也可以在自己的应用程序中使用 FleaPHP。不管你的应用程序是否是商业应用,都不需要公开你的源代码。从最大程度上保护你的知识产权。
当然,如果你愿意将代码反馈到社区,那么大家都会感谢你。
请记住,FleaPHP 是一个持续发展的框架,随时有新特性被加入到框架中。你现在需要,但 FleaPHP 尚未提供的功能,也许不久以后就出现在 FleaPHP 中了。当然,这需要你积极参与 FleaPHP 的发展,提出你的建议和意见。
自由的 FleaPHP
FleaPHP 是一个遵循 BSD 协议发布的开放源代码应用程序开发框架。你可以免费获取 FleaPHP 框架,并应用到自己的开发工作中。与流行的 GPL 协议不同,FleaPHP 遵循的 BSD 协议不要求开发者将基于 FleaPHP 框架开发的应用程序公布于众。这很好的保护了开发者及其所属企业的利益。更进一步,即便你基于 FleaPHP 实现了自己的产品或者对 FleaPHP 进行了修改以满足自己的需求。你仍然不需要公布你的劳动成果。
下面是关于 BSD 协议的简单介绍:
BSD 开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了 BSD 协议的代码,或者以 BSD 协议代码为基础做二次开发自己的产品时,需要满足三个条件:
- 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的 BSD 协议。
- 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的 BSD 协议。
- 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD 协议鼓励代码共享,但需要尊重代码作者的著作权。BSD 由于允许使用者修改和重新发布代码,也允许使用或在 BSD 代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。很多的公司企业在选用开源产品的时候都首选 BSD 协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
FleaPHP的起源
两年多以前,我开始涉及使用 PHP 开发 Web 应用的工作。在反复编写一些过程式代码后,我彻底厌倦了这种开发方式,开始怀念 C++ 中的面向对象设计。这时,正好在 ChinaUnix 上看到了 shukebeita兄的精华贴 。在这篇帖子里,shukebeita 提出了一种面向对象的 PHP 应用开发方式。虽然只有一个雏形,但这已经让我受益匪浅。
随后,我根据 shukebeita 的思路实现了 PFC 的第一个版本(当时命名为轻量级 OO 框架)。其实说起来,根本不能称之为框架,仅仅只有两个类。但已经实现了一个简单但实用的核心结构。现在回过头来看,PFC1 实际上实现了一个 Dispatcher 模式,根据 HTTP 请求中的 action 参数调用不同的代码。
在接下来的两年时间,PFC 不断翻新,最终发展到了 PFC3。该版本的 PFC 已经完整的实现了 Dispatcher、MVC 模式,并且引入了 ViewDriver 抽象层、基于角色的权限验证、采用 Provider 模式实现的用户和角色信息管理、一个简单的但带有缓存功能模板引擎等内容。期间曾经试图将 PFC 发扬光大(笑),可惜由于工作变动和个人原因,项目进度非常缓慢,最后终于放弃了。但导致 PFC 放弃的主要原因并不是因为进度缓慢,而是因为我看到了 Web 应用开发的杀手 —— Ruby on Rails。
Ruby on Rails
Ruby on Rails (后文简称 RoR)是一个采用 Ruby 语言实现的快速、轻便的 Web 应用开发框架,通过契约式编程大大简化了 Web 应用的开发工作。
所谓契约式编程,基本思想就是开发者必须严格遵守框架确定的一些规则和模式(例如对象命名、数据库主键字段命名等)。由于这些规则和模式的存在,框架可以自动完成许多以前需要开发者自己处理的工作。例如根据特定的名字,获取业务对象或者数据表操作对象。更主要的原因是 RoR 实现了 ActiveRecord 模式,并且在这个基础模式之上,扩展了许多便于开发者操作数据库的方法。
虽然 ActiveRecord 只能处理 Create(建立)、Read(读取)、Update(更新)、Delete(删除)等数据表操作,以及一对一、一对多和多对多等几种有限的数据表间关联关系。但我们平时开发的大量应用程序,CRUD 又何尝不是其中的主要内容呢。因此,RoR 为开发者解决了大部分日常任务,让开发者可以集中精力到更关键的地方,例如业务流程的实现。
在我看到 RoR 后,明白 PFC 虽然已经解决了 MVC 模式、权限验证等任务,但最主要的数据库访问却没有提供任何能够简化开发的解决方案。经过反复考虑,我终止了 PFC 系列,开始了一个“全新”的框架设计。
Flea1 与 FleaPHP
最初,这个新框架沿用了PFC系列的命名方式,命名为 flea1(也就是 FLEA 第一版)。在这个版本中,我试验了一些想法,并取得了不错的效果。
不过,我没有采用严格的 ActiveRecord 模式,而是采用了类似 CakePHP,一个类似 RoR 的 PHP 框架 的 Model 设计。这种设计既实现了 CRUD 操作,又实现了数据表间的关联操作。将这个最初版本的 flea1 框架应用到实际工作中后,马上取得了立竿见影的效果。数据库访问工作被大大简化,甚至连数据库访问代码都不用写了。而且对于数据表之间的关联,也能完成自动化的处理。
接下来,我拿到了《企业应用架构模式》这本经典的设计模式书籍。经过仔细研究,并实际测试。我发现在 PHP 里面使用 ActiveRecord 模式并不是一个很好的选择。因为 ActiveRecord 实际上是针对数据表里面的每一个数据行构造一个对象。这样一来,对于 PHP 这种面向对象能力不强(尤其是 PHP4)的脚本语言来说,带来了许多棘手的问题。
最终,flea1 的设计方案进行了一些调整,确定为现在的架构,并且框架命名为 FleaPHP。