2007 年 11 月 12 日
短短数年前,对 PHP 最常见批评之一是不支持 MVC 样式的架构。随着时代的变迁,现在在 PHP 框架领域里可以获得多种选择。本系列将介绍三个广泛使用的 PHP 框架 —— Zend、symfony 和 CakePHP —— 通过在三个框架中构建和扩展样例应用程序来检验这三个框架的类似之处和不同之处。
“PHP 框架” 系列专门针对那些想要开始使用框架、但又没有机会详细检验可用框架的 PHP 开发人员。在学完本系列后,您将了解选择这三个框架的原因、如何安装每个框架,并且充分运用将在三个框架中扩展的测试应用程序。听起来要学习的内容很多,但是不必担心。内容虽然多,但是我们已经把内容细分为多个便于管理的部分。
关于本系列
本系列的第 1 部分将列出本系列涵盖的内容,介绍将进行考察的框架以及说明如何安装,并查看将构建的第一个测试应用程序。
第 2 部分将指导您在三个框架中构建样例应用程序,着重说明了它们的类似之处和不同之处。
第 3 部分从扩展测试应用程序开始,然后处理不符合一般规律的例外情况。所有框架都能很好地完成份内的任务。每个项目中都需要完成一些框架设定工作之外的事情。第 2 部分就将介绍那些情况。
第 4 部分主要介绍了 Ajax 支持。使用本机代码和第三方库检验了 Ajax 的使用 —— 特别介绍了每个框架如何运行及接受具体的常用库。
第 5 部分将处理如何在框架外部工作。设定一项任务(每晚更新脚本),并在每个框架中检验完成此项任务的过程。
|
关于本文
本文提供了大量内容。您必须快速地跟上节奏。本文要对三种框架进行审视。是哪三种框架?为什么要针对这三种框架?还有其他哪些框架?为什么不选择其他框架?太多的问题要解答!但是在执行每个框架的安装过程之前,大部分问题都将得到回答。然后您将了解本系列后续文章中使用的测试应用程序。您马上就可以了解不同框架之间有何不同之处以及这些框架都可以实现哪些相同的工作。
系统要求
开始之前,需要具备一定的工作环境。需要满足的要求包括:
先决条件
假定您已经了解 PHP、应用程序设计,以及如何在数据库中工作。不要求您具有框架使用经验,但是您应当已经准备好开始使用框架。
|
模型框架
在了解哪些框架被选中之前,有必要来讨论一下框架是什么。
框架思想就是提供一种可以在多个应用程序中使用的设计。所有应用程序都有大量通用的基本内容 —— 具体地说,就是某类与数据库的接口、某些应用程序逻辑、应用程序呈现给用户的内容等。如果您编写过许多 PHP 应用程序,则会知道这些基本内容是什么。您可能已经编写过一组函数或从数据库中读取数据和向数据库中写入数据的类,可能已经使用过诸如 Smarty 之类的模板引擎来管理 UI。而且一定编写过大量 PHP 代码来完成诸如分析表单提交并根据提交的数据作决定之类的事务。如果您已经编写过很多应用程序,则可能已经一次又一次地做过相同的基本工作,有时还会将一个应用程序中的代码借用到另一个应用程序中。
框架专门用于为这些常用元素(数据库交互、表示层、应用程序逻辑)提供结构,以便您可以花费更少的时间来编写数据库接口代码或者表示层接口,而花费更多的时间来编写应用程序本身。以这种方式分解应用程序,这种架构被称为模型-视图-控制器(Model-View-Controller,MVC)。模型 指数据,视图 指表示层,而控制器 指应用程序逻辑或业务逻辑。对 MVC 的完整讨论超出本文的范围,但是鼓励您研究 MVC 并深入了解 MVC 的一切(请参阅 参考资料)。
|
选择框架
每种语言几乎都有若干个框架可用。选择刚好满足需求的框架可能有点难,尤其是当您以前未曾使用过任何一个框架时更是如此。虽然熟悉此领域的同事和可信赖的 developerWorks 作者提供的建议和评价会十分有帮助,但是选择任何框架时实际上应当遵循的惟一一个指导原则是:框架为每个人 节省的时间和精力越多越好。如果一个框架工作得很好但是会导致产生大量支持调用,那就不是一个优秀框架。如果一个框架易于支持,但是起到的阻碍作用大于辅助开发作用,那也不是一个优秀框架。如果一个框架十分优雅,但是会导致出现支持问题和开发问题,那么这个框架也是没有用的。
选择项目框架时,考虑从上到下所有相关人员的意见,并且在评估框架时,考虑到对其他各方的影响。
当考虑采用一个框架时,请进一步审视您的应用程序,并思考该应用程序是不是需要一个框架。框架不是必需品。即使不使用框架,也可以继续编写企业应用程序。框架会对项目有帮助么?它是否会节省每个人的时间和精力?您的应用程序在框架中是否会执行得更好?它是否将提供所缺乏的稳定性?如果上面任意一个问题的答案为是,那么您应当考虑采用框架。如果所有这些问题的答案都为否,那么使用框架只会把事情变复杂。
可惜,本文的长度和范围限制不允许全面介绍所有可用的 PHP 框架。本系列主要介绍三个框架:
选择这些框架的原因有很多,但可能都属于这几类因素:“您老板听说过的框架”、“某些人已经安装过的框架” 或者 “曾经谈论过的框架”。我鼓励您研究 CodeIgniter、Seagull、Web Application Component Toolkit (WACT)、PRADO、Zoop、PHP on Trax 或者其他众多可用 PHP 框架中的一个。框架选择全凭个人喜好,就像选择用哪种语言编写代码一样。本系列不会告诉您哪个框架比其他框架更好或更差。哪个框架在某方面做得好,我们就会讨论它。哪个框架看上去不实用,我们也会讨论它。即使我们不能全面地涵盖各种框架,我们采用的方法也将帮助您学会衡量其他框架的优点和缺点。您需要对正在检验的框架形成自己的观点,哪些框架您喜欢,并且决定继续使用哪个框架。
Zend 框架
所有人都知道 Zend —— “PHP 公司”。当您下载和安装 PHP 时,从大约 V3 开始,您就是在从 Zend 下载 PHP。除了发布 PHP 之外,Zend Technologies 多年来已经提供了大量 PHP 支持技术。Zend 提供适用于 PHP 的框架应当不稀奇 —— 这是一个到现在为止已经有两百万下载次数的流行框架。如果您老板听说过 PHP 框架,那么很可能指的就是 Zend 框架。
symfony
由 Sensio 赞助的 symfony “旨在提高创建和维护 Web 应用程序的速度,以及用功能、控制和愉悦来替代重复性的编码任务”。symfony 框架已经在世界各地的许多企业级应用程序中使用,其中可能包括最著名的 Askeet 和 Yahoo! 书签。如果您认识的某个人安装、使用或玩转某个 PHP 框架,那么该框架很可能就是 symfony。
CakePHP
CakePHP 大部分源自 Ruby on Rails,它旨在把简单性和可伸缩性引入到 PHP 框架中。CakePHP 一直被视为顶级 PHP 框架,并且 PHP V5 最近被选作 Mambo Content Management System 的核心。受强大的社区及快速增长的用户库推动,CakePHP 的受欢迎程度正在稳步增加。如果您曾听到过关于 PHP 框架的讨论,那么该讨论可能就是关于 CakePHP 的。
|
安装
每个框架都有自己的一组安装说明,并且完整的安装细节超出本文的范围。本文将重点说明这三个框架的安装,突出每个单独框架的安装说明里可能未涉及的要点,或者需要有别于安装说明的内容,因为将全部三个框架安装到一台计算机上十分特殊。
首先创建一个文件夹来保存所有代码、框架并包括本系列需要的内容(例如,名为 /column 的目录)。在此目录中,创建四个附加目录:htdocs、protected、include 和 src。编辑 Apache conf 文件,使文档根目录指向 /column/htdocs —— 然后当您处于该目录中时(如果尚不在其中),应当启用 mod_rewrite。编辑 php.ini conf 文件使 /column/include/ 目录包含在 include_path 指令中。如果您还没明白所有这些操作的意义,请不要着急。当您安装框架时,一切都会变得清晰。
安装 Zend 框架
下载 Zend 框架(请参阅 参考资料)。本系列使用的是 V1.0.1。下载并将 Zend 框架解压缩到 /column/src 目录中。该发行版将包含若干个文本文件和三个目录:demos、tests 和 library。把库目录(这应当只是名为 Zend 的文件夹)的内容复制到 /column/include/ 目录中。现在应当有包含若干个目录和文件的名为 /column/include/Zend 的文件夹。这些是 Zend 框架所使用的库。
好的!您已经安装了 Zend 框架。
安装 symfony
下载 symfony(请参阅 参考资料)。您可以通过下载页面中列出的任意一种方法随意安装 symfony,但是出于我们的目的建议下载 tarball。将 tarball 解压缩到 /column/src/symfony/ 目录中。您应当会看到四个目录(data、doc、lib 和 licenses),以及一些 README 文档。对于安装完成的应用程序来说,并不是所有的这些文档和目录都是必需的,但是现在,有这些文档和目录是可以的。对于安装来说,看上去可能过于简单。一定要记住,这些框架一般都是由实用程序和库组成的,因此安装框架并不难。使用框架需要执行一些追加配置。稍后您就将清楚如何配置。
安装 CakePHP
下载 CakePHP(请参阅 参考资料)。本系列使用的是 1.2.0.5427alpha 版本。不管是不是成熟的 alpha 版本,CakePHP 的 1.2 分支已经成为 CakePHP 社区广泛接受的标准。下载并解压缩 tarball,将其内容放到 /column/src/cakephp 中。应当得到四个目录(app、cake、doc 和 vendors)以及两个文件(.htaccess 和 index.php)。稍后将对这些文件中的一些文件进行操作,不过现在这样就可以了。
|
测试应用程序
您已经下载并安装了三个框架。但是您可能已经注意到自己尚未用这三个框架执行任何实际操作,例如用 Hello World 应用程序检验安装。那是因为您要跳过 Hello World 并转到较深入(但不会非常深入)的内容中。
在 PHP 框架中构建 Hello World 应用程序可能会有点痛苦。使用框架需要花费一定的系统开销,并且该系统开销发生在您尝试创建诸如 Hello World 等简单内容时。但是,在处理更复杂的应用程序时,同样的系统开销看上去则成为合理的支出。
您将构建的测试应用程序并不复杂。该测试应用程序将允许您使用文本区域把文本粘贴到应用程序中。该文本将被保存到数据库中并在请求时由该应用程序检索来显示。使用这样一个应用程序,您将可以轻松地创建和更新 Web 站点中的内容,而无需编辑 HTML 或上传新文件。这种高度创新并使用新方法的应用程序将被称为 Blahg。
Blahg 怎样使用?
根据 Blahg 的描述,您可能已经推断出如何设计应用程序需要考虑的几个方面。Blahg 需要四个元素:
很明显,Blahg 可以比现在更健壮,并且稍后在本系列中,您将执行一些增强工作。但是现在,满足这些简单要求就足够。可惜的是,您现在还不能获得在任意一个框架中构建 Blahg 的机会。那要在第 2 部分中进行。但是现在是设置您将使用的数据库的最佳时机。
|
设置数据库
在可以实际构建 Blahg 之前,需要设置数据库。并不是每个单独框架都必须设置数据库,但是出于本系列的学习目的,这样做将使事情变得更有序,同时可以避免必需的表前缀。
创建三个名为 Zend、symfony 和 Cake 的数据库,并将对每个数据库的全部权限授权给相应的用户。下面每个框架的指令都将包含创建 posts 表必需的 SQL。
摆弄数据库的同时,您也可以创建 Blahg 将在开头使用的表。使用以下 SQL 在 Zend 和 symfony 数据库中创建 posts 表。
CREATE TABLE 'posts' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
'title' VARCHAR( 255 ) NOT NULL ,
'text' TEXT NOT NULL ,
'modified' TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE = MYISAM ;
|
对于 Zend 和 symfony,将把对修改后的列的维护工作留给数据库。对于 CakePHP,将使用略有不同的 SQL。这样做将使 Cake 为您变一些魔术(尤其是,CakePHP 将自动维护修改后的列)。
CREATE TABLE 'posts' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
'title' VARCHAR( 255 ) NOT NULL ,
'text' TEXT NOT NULL ,
'modified' DATETIME DEFAULT NULL
) ENGINE = MYISAM ;
|
这和使用表语法一样简单。根据这些表的外观,您应当非常清楚 Blahg 的外观及运行会是怎样的。您甚至可能亲自构建 Blahg。
|
接下来的步骤
请忍住要立即投入并开始玩转框架的诱惑。相反,花一些时间在不使用任何框架的情况下构建 Blahg。用您惯用的方法编写一个应用程序,不用管那是一种什么样的方法。构建 Blahg 时一定要遵守上面列出的要求 —— 仍然不要太有想象力。通过在框架上下文外部构建测试应用程序并修改应用程序以包括在本系列中构建的增强功能,您可以很好地衡量给定框架对需求和开发风格的满足程度。
|
结束语
到这里,我们已经打好了基础。我希望您的安装顺利完成,但是如果遇到任何问题,则一定要研究每个单独框架的安装文档(请参阅 参考资料)。请花一些时间根据以上指导信息构建 Blahg。这将是您值得花时间去做的事情。
参考资料
学习关于作者
|
Duane O'Brien 从 Oregon Trail 还只是文本的时候开始,就一直在技术方面游刃有余。他喜欢的食物是寿司。他还不曾去过月球。 |
上一篇 告别丑陋banner条,InMobi联合开发者尝试原生广告
下一篇 java.lang.NoClassDefFoundError: com.doodlemobile.gamecenter.Platform