PHP 框架,第 2 部分: 构建样例应用程序

PHP 框架” 系列将介绍三个广泛使用的 PHP 框架 —— Zend、symfony 和 CakePHP —— 通过在三个框架中构建和扩展样例应用程序,研究三个框架的类似之处和不同之处。第 1 部分将列出本系列涵盖的内容并且配置先决条件。在第 2 部分中,您将分别在三个框架中构建样例应用程序。

在本系列的 第 1 部分 中,我们已经设定了本系列的范围并满足了先决条件。现在,将分别在三个框架中构建样例应用程序。在接下来的几篇文章里,将扩展应用程序、了解不符合常规的例外情况、使用 Ajax、集成外部任务等等。

本文将指导您分别在三个框架中创建样例应用程序 Blahg。您将从头做起,了解在 Zend 框架、symfony 和 CakePHP 中开发简单应用程序的基础知识。

您应当已经完成了 第 1 部分,该部分介绍了如何安装这三个框架及使用三个框架必须满足的先决条件。如果您还未读过这一部分,则应立即阅读。

假定您已经了解 PHP、应用程序设计以及如何在数据库中工作。您不需要具有框架使用经验,但是您应当已经准备好开始使用框架。

在 Zend 框架中构建 Blahg

首先,创建目录 /column/htdocs/zend 和 /column/protected/zend。这些目录将分别保存 Web 可访问的文件及 Web 不能访问的应用程序文件。在 /column/htdocs/zend 中,用以下命令行创建一个 .htaccess 文件:

RewriteEngine on
RewriteRule !/.(js|ico|gif|jpg|png|css)$ index.php

在涉及目录结构时,每个框架都有自己特定的要求。对于 Zend 框架,需要创建目录 /column/protected/zend/controllers、/column/protected/zend/models 和 /column/protected/zend/views 来保存控制器、模型和视图。此外,需要创建目录 /column/protected/zend/views/scripts;并且对于每个控制器,需要创建一个目录来保存一些视图。例如,您知道 Blahg 将需要为 post 控制器提供一些视图,那么就需要创建目录 /column/protected/zend/views/scripts/post 来保存该视图。

已经准备好目录。该来构建模型了。

构建 Zend posts 表和模型

在第 1 部分中,创建了将要使用的 posts 表。如果您跳过了那段内容,请立即查看并且创建该表。该表的模型非常简单。它应当被命名为 Posts.php,并且应当在 /column/protected/zend/models/ 创建它。Posts.php 将扩展 Zend_Db_Table 类,并且您将使用的大多数方法均继承自该类。如果打开代码归档中的 Posts.php 文件,您将看到实际代码非常少。

构建 Zend Front 控制器和 PostController

对于 Front 控制器,将在 /column/htdocs/zend 中创建 index.php 文件。此文件是应用程序公开给外界的惟一部分。应用程序的其余部分是通过此文件来访问的。Front 控制器需要完成几项事务:装入 Zend Loader(避免必须手动包含各个库)、设置与数据库的连接以及将请求分派给相应的应用程序控制器;在本例中为 PostController

如您所料,将在 /column/protected/zend/controllers 目录中创建 PostController.php 文件。需要创建的 PostController 十分简单。

如果您是初学者,则需要包括先前创建的 posts 模型。并且可能需要创建 init 方法,在创建 PostController 对象时将调用该方法。在 init 方法中,可以设置将在后续操作中使用的视图和模型对象。您也许可以猜测到需要三个操作:indexActionreadActionwriteAction(操作的 xxxxxAction 命名约定遵循 Zend 框架规定)。

indexAction 十分简单:获得所有的 posts 并将其分配给视图。readAction 不太复杂:通过请求获得 post ID、检索 post 并将 post 分配给视图。writeAction 也根本不复杂。如果发出了一个请求,则去掉所有标记并将数据保存到数据库中。否则,呈现表单。

有关语法和结构的详细信息,请查阅代码归档中的 PostController。现在对控制器的处理已经完成,接着构建视图。

构建 Zend post 视图

任务即将完成。Blahg 要求使用一些视图,并且需要在 /column/protected/zend/views/scripts/posts 目录中创建所有这些视图。至少需要三个视图(index.php、read.php 和 write.php),不过代码归档中的代码使用了四个视图。视图都是十分简单的文件:索引视图和读取视图只是应用最少的格式输出分配给它们的数据,而写入视图将显示发布到 Blahg 中时要使用的表单。有关详细信息,请查阅 代码下载 中的视图。

如果您已经正确地创建了模型、控制器和视图(或者正确地安装了代码),则应当能够通过转到 http://localhost/zend/post 访问 Zend 框架版本的 Blahg(假定您是在本地安装的所有内容)。

您可能十分渴望现在就试试 Blahg。请先不要那样做。您还有另外两个框架需要学习。





回页首


在 symfony 中构建 Blahg

在 symfony 中构建 Blahg 有些不同。如果您是初学者,则需要使用 symfony 的命令行实用程序来对项目进行初始化。

运行 symfony init 命令

切换到终端窗口并使用命令行创建 /column/protected/sf_column 目录。这将是受保护的目录,用于保存列的所有 symfony 代码。所有的 symfony 命令行工作必须从该目录完成。切换到 sf_column 目录并执行以下命令:php /column/protected/symfony/data/bin/symfony init-project sf_column

此命令将在 /column/protected/sf_column 中创建 symfony 项目必需的若干目录和文件。接下来,需要使用 init 来初始化 Blahg 应用程序。在 sf_column 目录中,执行以下命令:php /column/protected/symfony/data/bin/symfony init-app blahg

此命令将主要在 /column/protected/sf_column/apps 中创建另外一些目录和文件。但是需要先重新排列某些文件,然后才能使用大多数目录和文件。记住,安装向外界公开的文件非常少。由 symfony 的 init 脚本构建的应用程序结构不知道您的目录结构是怎样的。幸运的是,可以通过把下面几行添加到 /column/protected/sf_column/apps/config/config.php 的末尾更改该应用程序结构。


清单 1. 更改 symfony init 脚本的应用程序结构

                
$sf_root_dir = sfConfig::get('sf_root_dir'); 
sfConfig::add(array( 
'sf_web_dir_name' => $sf_web_dir_name = 'symfony', 
'sf_web_dir' => DIRECTORY_SEPARATOR.'column'.DIRECTORY_SEPARATOR.'htdocs'.
                                         DIRECTORY_SEPARATOR.$sf_web_dir_name, 
'sf_upload_dir' => DIRECTORY_SEPARATOR.'column'.DIRECTORY_SEPARATOR.
              'htdocs'.DIRECTORY_SEPARATOR.$sf_web_dir_name.DIRECTORY_SEPARATOR.
			  sfConfig::get('sf_upload_dir_name'), )); 

实质上,这些行将告诉 symfony 在什么位置查找 web 目录。

现在已经添加了这些行,您应当把 /column/protected/sf_column/web 的内容移到 /column/htdocs/symfony 中(如果尚未创建,请创建此目录)。最后一个要点是,需要修改 /column/htdocs/symfony/index.php 使其知道项目的实际根目录位置。用下面的行替代 SF_ROOT_DIR 的现有定义:define('SF_ROOT_DIR', '/column/protected/sf_column');

几乎就要完成了。现在只需使用 init 初始化 Blahg 的 post 模型。这意味着要在命令行中运行另一条命令:php /column/protected/symfony/data/bin/symfony init-app blahg。这条命令像其他命令一样,将构建一些文件和目录,这次是在 /column/protected/sf_column/apps/blahg/modules/post 中。

现在已经使 symfony 启动并运行,是该整合 Blahg 的时候了。

注:symfony 提供了自动生成代码的功能,用于基于数据库提供 CreateReadUpdateDelete (CRUD) 功能。虽然这可以帮助您快速地集中应用程序的基本信息,但是在这种环境下使用它,您无法清楚地了解 symfony 应用程序进行整合的方式。基于本文的学习目的,您将手动构建应用程序。

生成模型

您将使用的 posts 表同样是在 第 1 部分 中创建的。

由于 symfony 将使用 Propel 来提供对象关系映射 (Object Relational Mapping),因此需要用 symfony 命令行实用程序来生成模型。这要求描述数据库模式并先提供一些数据库信息。

注:技术上讲,没有必要先提供数据库信息。symfony 将根据模式构建模型,并且甚至可以使用命令行实用程序生成 SQL 脚本以根据模式定义创建数据库。我们将在后面的一篇文章中尝试该操作。

对于数据库和模式定义文件,symfony 将使用 Yet Another Markup Language (YAML)。YAML 不太复杂,但是如果您以前从未使用过它,则它可能会有些令人迷惑。在这个例子中,对于 YAML 需要了解到 whitespace 非常重要。使用两个空格表示缩进,而且绝不使用制表符。

现在将编辑 database.yml 和 schema.yml 文件。这些文件位于 /column/protected/sf_column/config 中。并且需要编辑 schema.yml 文件来描述 posts 表。编辑模式文件以包含下列信息:


清单 2. 编辑 schema.yml 文件

                
propel:
  posts :
    _attributes: { phpName: Post }
    id:
    title:       varchar(255)
    text:        longvarchar
    modified: timestamp

注:由于您可能是复制并粘贴了这段代码,请返回查看并确保每个缩进都是两个空格,并且未使用任何制表符。例如,modified 行开头前应当有四个空格(两个表示 posts 的缩进,两个表示 modified 的缩进)。

应当编辑 database.yml 文件使其包含具体的数据库参数。该文件看上去可能类似清单 3。


清单 3. database.yml 文件

                
all:
  propel:
    class:          sfPropelDatabase
    param:
      phptype:      mysql
      hostspec:     localhost
      database:     symfony
      username:     frameworks
      password:     fwpw 

这应当不难。现在模式和数据库配置已经完成,您可以生成模型了。返回到先前使用的命令行并在 /column/protected/sf_column 中执行以下命令:

php /column/protected/symfony/data/bin/symfony propel-build-model
php /column/protected/symfony/data/bin/symfony clear-cache 

每条命令都将输出大量数据,但是重要的最终结果是在 /column/protected/sf_column/lib/model 中创建 Post.php 和 PostPeer.php 文件 —— 这些是您的模型。如果打开这些模型,您将看到那里面没有很多内容。它们只是扩展了基本模型类。

注:无论何时重新构建模型,都必须运行上面的 clear-cache 命令。

好的!这一轮对模型的学习已经完成。关于模型还有很多内容可说,但是接着需要构建控制器。

构建控制器

您不需要像在 Zend 中一样编写 Front 控制器,因为 symfony 已经为您提供了该控制器。

post 控制器实际上将被称为 actions.class.php 并且将位于 /column/protected/sf_column/apps/blahg/modules/post/actions 中。此控制器将为 post 模块处理所有操作。像以前一样,您需要三个操作,但是名称不同:executeIndexexecuteReadexecuteWrite(executeXxxxxx 是 symfony 所使用的操作命名约定,并且必须遵守)。

executeIndex 操作十分简单:检索 posts 并使其对视图可用。executeRead 操作也十分简单:获取 post ID、检索 post 并使 post 数据对视图可用。executeWrite 操作将从请求中获取标题和文本并将数据保存到数据库中,返回已经保存的 post 的 ID。

有关语法和结构的详细信息,请查看 代码下载 中的 post/actions/actions.class.php。现在控制器已经完成,可以接着构建视图。

构建视图

post 视图将位于 /column/protected/sf_column/apps/blahg/modules/post/templates 中。您需要三个视图:indexSuccess.php、readSuccess.php 和 writeSuccess.php(xxxxSuccess.php 命名约定是必须遵守的 symfony 约定)。

这些视图不会像 Zend 视图一样呈现成完全的 HTML 文档。symfony 提供了一个默认的布局模板(在 apps/blahg/templates/layout.php 中),该模板提供了 HTML 页面的基本页头和页尾。您需要提供的全部内容是视图的中间部分 —— 操作的具体内容。例如,indexSuccess.php 只需要循环并设定所提供的 posts 数组的格式,readSuccess.php 只设定 post 内容的格式,而 writeSuccess.php 将在 post 被提交后显示表单或输出成功消息。

如果创建或安装过程一切正常,您应当能够通过转到 http://localhost/symfony/post 访问 symfony 版本的 Blahg(假定所有内容都安装在本地)。

现在您已经了解了 Blahg 如何在 Zend 框架和 symfony 中整合。已经在两个框架中构建了 Blahg,还剩最后一个框架。





回页首


在 CakePHP 中构建 Blahg

开始在 CakePHP 中构建 Blahg 之前,必须先创建一些文件。然后设置数据库连接并让 Bake 接管。

设置文件结构

看一看 /column/protected/cakephp/ 目录。您应当会看到四个目录:application(保存应用程序的目录)、cake(包含 Cake 的核心文件的目录)、docs(自述文档)和 vendors(放置可能使用的第三方库的位置)。还有两个文件:index.php 和 .htaccess。仅当您在 webroot 中安装 CakePHP 时才会使用这两个文件。通常,这不是明智的做法,因为它允许使用 Web 浏览器的任何人访问应用程序的所有文件。

安装的首选方法是使 /column/protected/cakephp/app/webroot 成为 Web 服务器的根目录。等效的可行方法(且为本系列的首选方法)是把 /column/protected/cakephp/app/webroot 的内容复制到 Web 可访问的目录(在本例中为 /column/htdocs/cakephp)中。继续并立即执行该操作。

当您复制完文件之后,需要打开 /column/protected/cakephp/app/webroot/index.php 并作一些编辑:需要更新 ROOTAPP_DIR 的现有定义。它们应当类似清单 4。


清单 4. ROOTAPP_DIR 的定义

                
    if (!defined('ROOT')) {
         define('ROOT', DS . 'column' . DS . 'protected' . DS . 'cakephp');
    }
    if (!defined('APP_DIR')) {
         define('APP_DIR', 'app');
    }

您可以继续构建,但是您也可以输入数据库信息并用 CAKE_SESSION_STRING 的惟一值更新 core.php。

在 /column/protected/cakephp/app/config/ 中,为 database.php.default 创建一个名为 database.php 的副本,然后输入系统的主机、登录名、密码和数据库名称。另外,在 /column/protected/cakephp/app/config/core.php 中,将 CAKE_SESSION_STRING 的定义更改为包含一个新值,例如 define('CAKE_SESSION_STRING', 'He had a Subbuteo player in his hair. I got distracted.');

您已经完成了预备工作。现在可以开始享用 CakePHP 了。

注:像 symfony 一样,CakePHP 提供了自动生成代码功能来基于数据库提供 CRUD 功能。CakePHP 还提供了可以提供类似服务而无需生成任何代码的 scaffolding。这两个功能都能帮助您快速集中获得应用程序的基本信息,但是如前所述,在此环境中使用这些功能将不会给您提供在 CakePHP 中构建应用程序的太多感受。

创建表和模型

如果您没有 posts 表,您跳过了第 1 部分中创建 posts 表的那一部分,请立即转到相应位置查看并创建该表。在 /column/protected/cakephp/app/models 目录中创建名为 post.php 的文件。该文件将包含模型的类定义。定义十分简单:类是 Post 并扩展 AppModel,并且应当将类变量 $name 设为 post

所有工作就这么多。您的模型将使用来自 AppModel 的所有继承方法。现在可以接着构建控制器了。

注:您可能已经注意到该表被称为 posts(复数),而模型名称为 post(单数)。这是 Cake 的重要约定部分。模型总是单数,而其对应的表总是复数。

构建 Cake posts 控制器

posts 控制器将十分简单,像您今天编写的其他控制器一样。您将安插几个帮助器,然后定义三个操作:indexreadwrite

index 操作将获取 posts 列表并使其对视图可用。read 操作将获取 post 的 ID,检索 post 并使 post 数据可用于视图。write 操作用于接受提交(如果有提交操作)并将数据保存到数据库中。

有关语法和结构的详细信息,请查看 代码下载 中的 /column/protected/cakephp/app/controllers/posts_controller.php。

控制器已经完成。现在可以接着构建最后几个视图。

构建 Cake 视图

您需要使用在其他框架中为 Blahg 创建的三个基础视图。在本例中,您将在 /column/protected/cakephp/app/views/posts 目录中创建 index.ctp、read.ctp 和 write.ctp 文件。这些文件只是 CakePHP 将使用的模板,它们很像您在 symfony 中创建的模板。请查看代码归档中的这些文件。视图将充分使用表单和 HTML 帮助器来输出链接和表单元素,但是它们看上去应当类似您为 symfony 创建的其他视图。

注意,视图不会呈现到完全的 HTML 文件中。默认布局是由 CakePHP 提供的。这些默认布局文件都是位于 /column/protected/cakephp/cake/libs/views/templates/layouts 中,但是不必修改这些文件。如果需要更改默认布局,请将 default.ctp 布局文件的副本放到 /column/protected/cakephp/app/views/layouts 中并根据需要进行修改。

注:使用这些帮助器的话,则 Cake 中的表单和链接更易于维护,因为 Cake 将确保链接指向应用程序中的正确安装位置或移至其他目录的位置,并且如果正确设定了表单元素名称的格式,Cake 将为您完成大部分工作。

根据 Blahg 的需求构建视图,或者安装 代码下载 中的视图。假定所有内容均已正确编写并安装,您应当能够访问位于 http://localhost/cakephp/posts 的 CakePHP 版本的 Blahg(假定已在本地安装)。





回页首


结束语

您完成了很多工作:安装、启动并运行了三个框架,并且在每个框架中创建了一个基本应用程序。

花一些时间使用每个框架中的 Blahg,然后尝试在每个框架中扩展 Blahg。尝试编写一个 comments 控制器,该控制器将允许用户发布对每个 post 的回复。可是这时还不能把链接注释整合到 posts 中。但如果您感觉这样做没问题,那就尽管去做吧!在第 3 部分中,将为您提供涉及这部分操作的一些代码。






回页首


下载

描述名字大小下载方法
第 2 部分的源代码os-php-fwk2.zip11KBHTTP
关于下载方法的信息


参考资料

学习


获得产品和技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值