你是否要寻找韩庚的网站,请下载FIREWORK,再打开本地址即可进入韩庚网站
Oct
22

Zend Framework 基础知识

在开始编码前,首先设置基本的 Web 站点。在本节中,您将了解如何正确地设置 Zend Framework Web 站点,包括目录结构和准备默认的文件。然后您将查看基本的 Web 站点并查看如何使用 Zend_Controller 和 Zend_View 组件整合各个部分。

启动新的 Web 站点

Zend Framework 类似于 PHP 的其他框架。它为构建安全的可伸缩的站点提供许多工具,并且为与各个数据库和 Web 服务交互提供了大量库。您可以挑选需要使用的组件,而不必使用所有绑定在一起的组件。对于使用框架而不是重新编写应用程序主要部分来处理遗留站点的人员,这十分有帮助。

在启动新的 Web 站点时,Zend_Controller 组件专门用于帮助我们使用模型-视图-控制器(Model-View-Controller,MVC)设计模式给站点布局。MVC 是一个不断成长的 Web 开发标准,专门用于帮助您保持代码的良好结构和易于维护性。要了解 MVC 设计模式的更多信息,请查阅 参考资料 中列出的文章。

本教程中的应用程序代码已经被单独放到程序自己的目录中,并包含控制器、模型和视图等子目录,如清单 1 所示。对于本教程,建议使用相同结构。
清单 1. Zend Framework 站点的文件系统布局

application/ controllers/ IndexController.php models/ views/ scripts/ index/ index.phtml helpers/ filters/ layouts/ html/ .htaccess index.php library/ Zend/ MySite/

下载示例代码(请参阅 下载)将创建清单 1 所示的结构。我们将在 library 文件夹中添加样例应用程序可能使用的所有可重用代码(例如来自第三方的代码)。如果遵循了 系统要求,将很容易获得 Zend Framework ZIP 文件。将框架 ZIP 文件中的 library/Zend 文件夹导出到清单 1 的 Zend 目录中。

您将需要使用 Web 站点的文档根目录作为清单 1 中的 HTML 目录。这将防止从外界直接访问 PHP 代码,并且是一项优秀的安全实践。

如果使用的是 Apache Web 服务器,请编辑清单 1 中所示的 .htaccess 文件以添加清单 2 的内容。
清单 2. .htaccess 文件

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

如果要使用其他 Web 服务器,请参考 Zend_Controller_Router 文档(请参阅 参考资料)以获得其他 Web 服务器的重写规则示例。

编辑 index.php 并添加清单 3 中的内容。该文件是引导文件,该文件将处理所有传入请求并把这些请求定向到相应的控制器和操作。
清单 3. index.php 引导文件

您还需要设置一个默认控制器或者 IndexController。在未指定任何控制器时,例如向站点的根目录(即,http://localhost)发出请求时,则使用默认控制器。要处理这种情况,您将编辑 application/controllers/IndexController.php 文件,如下所示:
清单 4. IndexController

这将创建默认控制器和操作。将使用 indexAction() 指定控制器的默认操作。

回页首

ViewRender

Zend_Controller 组件的一个优秀特性是通过 ViewRenderer helper 集成了 Zend_View 组件。Zend_View 组件负责呈现 Web 站点的显示,而 ViewRenderer helper 将把这两个组件绑定在一起。要获得 Zend Framework 的各个组件的详细信息,请查阅 Zend Framework 的官方手册(请参阅 参考资料)。

默认情况下,每个控制器都将创建 Zend_View 组件的实例。在调用操作方法中的代码后,控制器将在与控制器同名的目录下的 application/views/scripts 文件夹中查找视图文件以及与操作同名的视图模板。每次调用操作时,都将自动在随后调用视图模板,除非我们以其他方式指定。

对于默认控制器,它将查找 application/views/scripts/index/index.phtml,以便我们把清单 5 中的内容添加到该文件中。
清单 5. index.phtml

Hello world!

当您在浏览器中查看 index.phtml 页面时,您应当会看到图 1 所示内容。
图 1. Web 站点的主页面

另一个必须添加的特殊控制器是错误控制器。只要框架内出现错误就会调用它,例如调用不存在的控制器或者操作。错误控制器的定义(如清单 6 所示)与普通控制器定义略有不同并且保存在 application/controller/ErrorController.php 中。
清单 6. ErrorController

然后您可以在 application/views/scripts/error/error.phtml 文件中创建视图模板,当出现错误时,将显示该文件。

回页首

使用 Zend_Controller

现在我们已经设置了基本的站点,现在可以在该基础上开始构建。对于本教程,我们将构建用于演示如何能够高效使用 Zend Framework 的基本组件的简单 Web 站点。Zend_Controller 专门使用简短的搜索引擎优化(Search Engine Optimization,SEO)友好的 URL。这将消除 “难看的” URL,例如那些带有很多 GET 参数的 URL。它还允许您给 URL 提供上下文并且使 URL 更具可读性。考虑用于按编号查找部件的以下 URL:http://localhost/partslookup.php?partid=123456。

现在,让我们用 SEO 友好的 URL 处理此 URL。我们将拥有一个名为 parts 的控制器,它处理所有与部件相关的查找,并且将调用查找操作,该操作将按 partid 处理部件查找任务。下面显示了这个 URL:http://localhost/parts/lookup/partid/123456。

因此,对于使用 Zend_Controller 的 Zend Frameworks Web 站点,您可以使用以下格式的 URL:http://localhost/controller/action/param/value/。

这将指定使用哪个控制器以及在该控制器中调用哪个操作。如果脚本有指向该控制器的任何参数,则在操作之后包含这些参数,并使用参数名 — 斜杠 — 值的格式。由于重写规则添加到了 .htaccess 文件(参见清单 2)中,因此将把所有请求传递到引导文件中,该引导文件将解析该 URL 以确定要调用哪个控制器和操作,并把参数放到控制器对象中以便您可以在那里引用这些参数。

回页首

您的第一个控制器

对于站点的第一部分,您将添加名为 record 的新控制器。它将使用五个操作实现记录的创建/读取/更新/删除(Create/Read/Update/Delete,CRUD)接口,使用该接口可以针对典型数据集处理各个操作。操作将包括 list(默认情况下它将返回记录列表)、edit(将以编辑模式返回一条记录)、create(将是一张用于输入新记录的表单)、save(保存记录)和 delete(删除记录)。首先,让我们开始在 application/controllers/RecordController.php 中创建 record 控制器的定义。
清单 7. RecordController

_redirect(’/record/list’); }

因此在这里,我们已经添加了控制器的默认 indexAction(),它将把用户重定向到 listAction。我们这样做是因为希望 record 控制器的默认视图是记录列表。

现在让我们看一看 listAction。
清单 8. RecordController::listAction()

public function listAction() { $this->view->records = array( array(”id” => 0, “name” => “record 1″, “data” => “data 1″), array(”id” => 1, “name” => “record 2″, “data” => “data 2″), array(”id” => 2, “name” => “record 3″, “data” => “data 3″), ); }

对于此操作,我们将为即将呈现的视图返回记录列表。在第 2 部分中,我们将看到如何从 Google Base 中检索这些记录,但是现在,我们将在联合数组的数据库中指定一个静态记录列表,类似于指定如何从数据库返回记录列表。

我们还将添加清单 9 中所示的 editAction,它使用记录编号作为参数并显示用于更新记录的编辑表单。在这里,我们将再次指定用于 listAction() 的同一个静态记录清单,但是还使用以数组形式返回条目的给定参数。
清单 9. RecordController::editAction()

public function editAction() { $records = array( array(”id” => 0, “name” => “record 1″, “data” => “data 1″), array(”id” => 1, “name” => “record 2″, “data” => “data 2″), array(”id” => 2, “name” => “record 3″, “data” => “data 3″), ); $id = $this->_getParam(’print’,'0′); $this->view->id = $id; $this->view->record = $records[$id]; }

我们已经介绍过如何使用 _getParam() 方法检索传递给表单的参数。您还会注意到方法的第二个参数。如果 URL 中未指定第二个参数的默认值,那么可以进行设置。

createAction 类似于清单 10 中的 editAction,不同之处是返回表单没有填充任何数据。但是,我们可以重用视图,因为显示逻辑是相同的。
清单 10. RecordController::createAction()

public function createAction() { $this->view->id = ‘-1′; $this->view->record = array(”name”=>”,”data=>”); $this->render(’edit’); }

我们还将为清单 11 中的另外两个操作 delete 和 save 添加桩。在这两种情况下,将分别执行 delete 或 save 代码,然后返回到 list 视图。在第 2 部分中,我们将添加与 Google Base 的集成,但是现在,我们将让它把消息输出到浏览器中,就好像它执行了我们要求的保存或删除一样。
清单 11. RecordController::saveAction() 和 RecordController::deleteAction()

public function saveAction() { /* here we will save the record */ $this->_redirect(’/record/list/’); } public function deleteAction() { /* here we will delete the record */ $this->_redirect(’/record/list/’); } }

回页首

添加视图

现在让我们添加视图模板。这些模板将位于 application/views/scripts/record/ 目录中,并且有两个文件:list.phtml 和 edit.phtml。这两个文件是类似于上面创建的 index.phtml 文件的标准 HTML 文件。在清单 12 中,您将看到第一个文件 list.phtml,并且它将拥有一个记录列表以及进行编辑或删除的选项。
清单 12. list.phtml

Home | Record

List of records

图 2. 记录列表视图

您将注意到使用了视图 helper escape() 方法。这将转义显示的变量输出以帮助避免可能发生的安全问题,例如跨站点脚本攻击。我们稍后将查看更多其他视图 helper。

清单 13 中的编辑视图是标准的 HTML 表单,该表单将提交到 record 控制器的 save 操作。
清单 13. edit.phtml

Home | Record

如果一切就绪,您的表单应当类似图 3。
图 3. Record Edit 视图

我们已经创建了数据的基本 CRUD 接口。现在让我们查看如何使用 Zend Framework 的一些高级功能来帮助优化我们的站点设计。

Feed Icon