第 10 章 Zend_Controller

目录

10.1. Zend_Controller 快速入门
10.1.1. 简介
10.1.2. 入门
10.1.2.1. 文件系统的组织结构
10.1.2.2. 设置文件根目录
10.1.2.3. 创建URL重写规则
10.1.2.4. 创建你的bootstrap文件
10.1.2.5. 创建默认的控制器(Action Controller)
10.1.2.6. 创建你的视图脚本
10.1.2.7. 创建你自己的错误控制器
10.1.2.8. 访问站点!
10.2. Zend_Controller 基础
10.3. 前端控制器
10.3.1. 概述
10.3.2. 主要方法
10.3.2.1. getInstance()
10.3.2.2. setControllerDirectory() 和 addControllerDirectory()
10.3.2.3. addModuleDirectory() and getModuleDirectory()
10.3.2.4. dispatch()
10.3.2.5. run()
10.3.3. 环境访问器方法
10.3.4. 前端控制器参数
10.3.5. 继承前端控制器
10.4. 请求对象
10.4.1. 介绍
10.4.2. HTTP 请求
10.4.2.1. 访问请求数据
10.4.2.2. 基地址和子目录
10.4.2.3. 决定请求方式
10.4.2.4. 删除 AJAX 请求
10.4.3. 子类化请求对象
10.5. 标准路由器
10.5.1. 简介
10.5.2. 使用路由器
10.5.3. 基本的Rewrite路由器操作
10.5.4. 缺省路由
10.5.5. 基本 URL 和子目录
10.5.6. Route Types
10.5.6.1. Zend_Controller_Router_Route
10.5.6.1.1. 变量缺省
10.5.6.1.2. 变量请求
10.5.6.1.3. 主机名路由
10.5.6.2. Zend_Controller_Router_Route_Static
10.5.6.3. Zend_Controller_Router_Route_Regex
10.5.7. 使用 Zend_Config with the RewriteRouter
10.5.8. Subclassing the Router
10.6. 分发器
10.6.1. 概述
10.6.2. 子类化分发器
10.7. 动作控制器
10.7.1. 简介
10.7.2. 对象初始化
10.7.3. 派遣前后的钩子
10.7.4. 访问器
10.7.5. 视图集成
10.7.5.1. 视图初始化
10.7.5.2. 解析(Rendering)视图
10.7.6. 实用方法
10.7.7. 继承(Subclassing)动作控制器
10.8. 动作助手
10.8.1. 介绍
10.8.2. 初始化助手
10.8.3. 助手经纪人
10.8.4. 内建的动作助手
10.8.4.1. 动作堆栈(助手)
10.8.4.2. AutoComplete
10.8.4.2.1. AutoCompletion with Dojo
10.8.4.2.2. AutoCompletion with Scriptaculous
10.8.4.3. ContextSwitch and AjaxContext
10.8.4.3.1. 缺省可用的上下文
10.8.4.3.2. 创建定制的上下文
10.8.4.3.3. 为每个动作设置上下文
10.8.4.3.4. 初始化上下文开关
10.8.4.3.5. 另外的功能
10.8.4.3.6. AjaxContext 函数
10.8.4.4. FlashMessenger
10.8.4.4.1. 简介
10.8.4.4.2. Basic Usage Example
10.8.4.5. JSON
10.8.4.6. 转向器(Redirector)
10.8.4.6.1. 介绍
10.8.4.6.2. 基础用例
10.8.4.7. ViewRenderer
10.8.4.7.1. 介绍
10.8.4.7.2. API
10.8.4.7.3. 基础用法示例
10.8.4.7.4. 高级用法示例
10.8.5. 编写自己的助手
10.9. 响应对象
10.9.1. 用法
10.9.2. 处理消息头
10.9.3. 命名片段
10.9.4. 在响应对象中测试异常
10.9.5. 子类化响应对象
10.10. 插件
10.10.1. 简介
10.10.2. 编写插件
10.10.3. 使用插件
10.10.4. 获取和控制插件
10.10.5. 包含在标准发行包中的插件
10.10.5.1. 动作堆栈
10.10.5.2. Zend_Controller_Plugin_ErrorHandler
10.10.5.2.1. 使用 ErrorHandler 作为一个 404 处理器(handler)
10.10.5.2.2. 处理以前呈现的(rendered)输出
10.10.5.2.3. 插件用法示例
10.10.5.2.4. 错误控制器示例
10.11. 使用传统的模块目录结构
10.11.1. 简介
10.11.2. 指定模块控制器目录
10.11.3. Routing to modules
10.11.4. 模块或全局缺省控制器
10.12. MVC 异常
10.12.1. 介绍
10.12.2. 如何处理异常?
10.12.3. 可能遭遇的MVC异常
10.13. 从以前的版本移植
10.13.1. 从 1.5.x 移植到 1.6.0 或更新的版本
10.13.1.1. 分发器接口修改
10.13.2. 从 1.0.x 到 1.5.0 或更新的版本的移植
10.13.3. 从 0.9.3 到 1.0.0RC1 或更新的版本的移植
10.13.4. 从 0.9.2 移植到 0.9.3 或更新的版本
10.13.5. 从 0.6.0 移植到 0.8.0 或更新的版本
10.13.6. 从 0.2.0 或以前的版本移植到 0.6.0

10.1. Zend_Controller 快速入门

10.1.1. 简介

Zend_Controller是Zend Framework的MVC体系的核心部份。MVC指Model-View-Controller,是一个用于分离应用逻辑和表现逻辑的设计模式。Zend_Controller_Front实现了Front Controller设计模式,所有的请求都通过front controller(前端控制器)并分发(dispatch)到不同的控制器来处理,分发的过程基于请求的URL。

Zend_Controller体系具有可扩展性,可以通过继承已有的类或者自己写个新的类来实现各种接口和抽象类,也可以编写插件或者助手类(helper)来增强系统的功能。

10.1.2. 入门

如果你想深入了解控制器,请认真看下面几节内容,如果你只是想快速地把系统搭建起来,看这一节。

10.1.2.1. 文件系统的组织结构

首先你要规划好自己的文件结构布局,典型的结构是这样的:

application/
    controllers/
        IndexController.php
    models/
    views/
        scripts/
            index/
                index.phtml
        helpers/
        filters/
html/
    .htaccess
    index.php

            

10.1.2.2. 设置文件根目录

将你的WEB服务器文件根目录指向上面文件布局中的html目录。

10.1.2.3. 创建URL重写规则

创建html/.htaccess,编辑其内容为:

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

            

在上例中,所有请求(除了对那几个扩展名的文件的请求)都被转向到index.php。如果你想在访问某些扩展名的文件时不转向到index.php,你可以建立自己的URL重写规则,或者直接把扩展名添加到(|)之中去。

[注意] 注意

上面的重写规则只能用于Apache服务器,如果你使用的是其它服务器,请查看 router的文档.

10.1.2.4. 创建你的bootstrap文件

(所谓Bootstrap,就相当于一小段引导程序或者入口程序,在ZF中,通常即指index.php,因为我们所有的请求都是从index.php进入的。--Haohappy注) 在设置好 .htaccess文件之后,建立一个新的文件index.php:

Zend_Controller_Front::run('/path/to/app/controllers');

            

这是一个入口文件,目的仅在于启动Zend_Controller_Front。Zend_Controller_Front用于分配请求到不同的控制器。

10.1.2.5. 创建默认的控制器(Action Controller)

在讨论控制器之前,你应该先理解Zend Framework是如何处理HTTP请求的。默认情况下,URL的第一个部份会映射到一个控制器,第二个部份则映射到控制器类中的Action(即控制器类内部的一个方法)。例如:URLhttp://framework.zend.com/roadmap/components,其服务器路径为/roadmap/components,则会映射到roadmap控制器和components Action。如果不存在action,则会调用index这个action。如果控制器不存在,则会自动调用index控制器。(按照Apache的命名惯例,自动映射到DirectoryIndex文件)

接下来,Zend_Controller的dispatcher会根据控制器的名称找到具体的控制器类。通常它会把控制器名称加上Controller。因此,上例中roadmap控制器与类RoadmapController相对应。

类似地,action会映射到控制器类中的一个类方法。默认情下,会被转成小写字母,然后加上Action字符串。因此,上例中components这个action与 componentsAction相对应。最终我们访问URL调用的是RoadmapController->componentsAction()

现在让我们来创建一个默认的控制器和Action方法吧。上面说过,默认的控制器和方法都以“index”命名。打开文件application/controllers/IndexController.php,输入:

/** Zend_Controller_Action */
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
    }
}

            

默认情况下,ViewRenderer会被启用。这意味着只需要简单地下定义一个action方法,就会自动指定一个对应的View脚本,你可在action中直接把内容输出。默认情况下,我们采用Zend_View作为MVC开发的表现层部份。ViewRenderer根据控制器的名称(例如index)和当前的action的名称(例如index)来决定使用哪个模板文件。默认情况下,模板文件使用.phtml作为扩展名。 也就是说,上例中,我们将使用index/index.phtml模板文件。 另外,ViewRenderer自动假设views目录与控制器目录平级,作为视图层的基础目录,而实际的模板文件则放置在views/scripts/ 子目录下。因为我们的模板文件应该是 application/views/scripts/index/index.phtml

10.1.2.6. 创建你的视图脚本

之前说过,视图脚本(即模板文件)放在application/views/scripts/目录下,而默认的模板是application/views/scripts/index/index.phtml。我们来创建这个文件,加入一些HTML代码:

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>My first Zend Framework App</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html>

            

10.1.2.7. 创建你自己的错误控制器

默认情况下,“错误处理器”插件 是已经被注册的。这个插件要求存在一个用于处理错误的控制器。它假设存在一个ErrorController,并且其中有一个名为errorAction的Action:

class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
    }
}

            

使用我们之前讨论的目录布局,这个文件将是application/controllers/ErrorController.php,你也需要为它创建一个模板文件,即application/views/scripts/error/error.phtml。其中的内容如下:

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>错误</title>
</head>
<body>
    <h1>出错了</h1>
    <p>出现了一个错误,请重试。</p>
</body>
</html>

            

10.1.2.8. 访问站点!

创建好了你的第一个控制器和模板,你现在可以打开浏览器来访问看看了! 假设example.com是你的站点域名,那么下面的URL都会带你访问你刚才创建的页面:

  • http://example.com/

  • http://example.com/index

  • http://example.com/index/index

恭喜你! 你已经准备好了,可以开始创建更多的控制器和Action!