第 7 章 Zend_Controller

目录

7.1. Zend_Controller 快速入门
7.1.1. 简介
7.1.2. 入门
7.2. Zend_Controller 基础
7.3. 前端控制器
7.3.1. 概述
7.3.2. 主要方法
7.3.3. 环境访问器方法
7.3.4. 前端控制器参数
7.3.5. 继承前端控制器
7.4. 请求对象
7.4.1. 介绍
7.4.2. HTTP 请求
7.4.3. 子类化请求对象
7.5. 标准路由器:Zend_Controller_Router_Rewrite
7.5.1. 简介
7.5.2. 使用路由器
7.5.3. 基本的Rewrite路由器操作
7.5.4. 缺省路由
7.5.5. 基本 URL 和子目录
7.5.6. Route Types
7.5.7. 使用 Zend_Config with the RewriteRouter
7.5.8. Subclassing the Router
7.6. 分发器
7.6.1. 概述
7.6.2. 子类化分发器
7.7. 动作控制器
7.7.1. 简介
7.7.2. 对象初始化
7.7.3. 派遣前后的钩子
7.7.4. 访问器
7.7.5. 视图集成
7.7.6. 实用方法
7.7.7. 继承(Subclassing)动作控制器
7.8. 动作助手
7.8.1. 介绍
7.8.2. 初始化助手
7.8.3. 助手经纪人
7.8.4. 内建的动作助手
7.8.5. 编写自己的助手
7.9. 响应对象
7.9.1. 用法
7.9.2. 处理消息头
7.9.3. 命名片段
7.9.4. 在响应对象中测试异常
7.9.5. 子类化响应对象
7.10. 插件
7.10.1. 简介
7.10.2. 编写插件
7.10.3. 使用插件
7.10.4. 获取和控制插件
7.10.5. 包含在标准发行包中的插件
7.11. 使用传统的模块目录结构
7.11.1. 简介
7.11.2. 指定模块控制器目录
7.11.3. Routing to modules
7.11.4. 模块或全局缺省控制器
7.12. MVC 异常
7.12.1. 介绍
7.12.2. 如何处理异常?
7.12.3. 可能遭遇的MVC异常
7.13. 从以前的版本移植
7.13.1. 从 0.9.3 到 1.0.0RC1 或更新的版本的移植
7.13.2. 从 0.9.2 移植到 0.9.3 或更新的版本
7.13.3. 从 0.6.0 移植到 0.8.0 或更新的版本
7.13.4. 从 0.2.0 或以前的版本移植到 0.6.0

7.1. Zend_Controller 快速入门

7.1.1. 简介

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

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

7.1.2. 入门

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

7.1.2.1. 文件系统的组织结构

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


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

7.1.2.2. 设置文件根目录

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

7.1.2.3. 创建URL重写规则

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


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

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

[注意] 注意

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

7.1.2.4. 创建你的bootstrap文件

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


<?php
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('/path/to/app/controllers');

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

7.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,输入:


<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';

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

7.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>

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

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


<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';

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>

7.1.2.8. 访问站点!

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

  • http://example.com/

  • http://example.com/index

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

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