第 4 章 Zend_Controller
上一页 |  | 下一页

## 第 4 章 Zend_Controller

## 4.1. 概述

### 4.1.1. 简介

Zend_Controller是使用MVC模式来构建一个站点的基础。Zend_Controller体系是一个轻量的，模块化和可扩展的体系。它只提供最核心的必要的部分，允许开发者有很大的自由来灵活地构建自己的站点。使用Zend_Controller的站点，其代码结构会有一部份是相似的。

`Zend_Controller` 的工作流(workflow)是通过几个组件来实现的。虽然不需要完全理解这几个组件的含义，如果你对工作流程有点了解是很有帮助的。

- `Zend_Controller_Front`是Zend_Controller_Controller体系的组织者，它是FrontController设计模式的实现。Zend_Controller_Front处理服务器接受的所有请求，并最后负责将请求分配给ActionController (`Zend_Controller_Action`)

- `Zend_Controller_Router`相当于一个路由器。路由是将一个URI分解并决定由哪一个controller，和用什么 Action来处理的过程。controller，action和可选的参数的定义，被封装成一个对象--Zend_Controller_Dispather_Token，然后由Zend_Controller_Dispatcher来处理。路由只发生一次：当请求被服务器接收到时，在分配到第一个控制器之前。

  (所谓router，和我们熟知的网络路由器的功能是很相似的，具有判断网络地址和选择路径的功能，这里就是用来重定向 --Haohappy注)

- `Zend_Controller_Dispatcher`即分配器。

  “分配”的过程即根据Zend_Controller_Dispatcher_Token来查找适合的contoller文件，实例化其中的 controller类(必须实现Zend_Controller_Action)，并且最后在控制器内运行action。和路由不同，分配的过程不断重复的，Zend_Controller_Dispatcher被Zend_Controller_Front不断调用直到所有action都依次分配完毕。

- `Zend_Controller_Action`是最基本的控制器。每个具体的控制器都是从Zend_Controller_Action类继承而来，是Zend_Controller_Action的子类，并且有自己的action方法。

Zend_Controller的工作流程相当简单。Zend_Controller_Front接收一个请求，然后由Zend_Controller_Router来决定分配给哪个controller。Zend_Controller_Router把URI分解封装成一个Zend_Controller_Dispatcher_Token 对象。Zend_Controller_Front接着进入一个分配循环，调用Zend_Controller_Dispatcher，把token对象传给dispatcher来分配到具体的controller和action进行处理。在controller结束后，又把控制权交加给 Zend_Controller_Front。如果controller发现需要分配另一个controller（返回一个新的token对象），循环会一直继续直到另一次分配执行完毕。

### 4.1.2. Route Process 路由过程

在你构建第一个控制器之前，你需要理解Zend_Controller_Router中的重定向过程是如何工作的。记住工作流程分为两步：一是重定向（routing），只发生一次；二是分配（dispatching），循环过程。

`Zend_Controller_Front` 调用Zend_Controller_Router来使一个URI映射到一个controller及其中的action上。Zend_Controller_Router分解URI，生成一个对象Zend_Controller_Dispatcher_Token，然后再传递给分配器（Zend_Controller_Dispatcher）。

router使用很简单的方法来决定使用的controller及其action：

    http://framework.zend.com/controller/action/

上面controller就是我们要采用的控制器，action就是我们要采用的action。

可选择地，参数可以在URI中定义，并传递给controller。格式为key/value　：

    http://framework.zend.com/controller/action/key1/value1/

如果/controller/这部分没有写明，默认调用index。 如果/action/这部份没有写，也默认调用index。如：

    http://framework.zend.com/roadmap/future/
    Controller: roadmap
    Action    : future

    http://framework.zend.com/roadmap/
    Controller: roadmap
    Action    : index

    http://framework.zend.com/
    Controller: index
    Action    : index

| 注意
我们正在开发一个新的使用URI重写引擎的router，这样可以更灵活一些。新版本会很快发布。

controller，action的名称及参数将会被封装到一个token对象中--Zend_Controller_Dispatcher_Token。这个对象被传回到Zend_Controller_Front，然后进入分配过程，被传递给Zend_Controller_Dispatcher。

### 4.1.3. Token对象

Token对象是个很简单的对象，在Zend_Controller_Front和实现router，dispatcher接口的类间传递。它把controller,action和参数封装在一起。

- controller的名称通过getControllerName()及setControllerName()来获得和设置

- action的名称过getActionName()和setActionName()来获得和设置.

- 传递给action的参数是个数组(key/value形式)，可以通过getParams()来获得，通过setParams()来设置

### 4.1.4. Dispatch Process 分配过程

所谓分配过程，就是根据token对象(Zend_Controller_Dispatcher_Token) ，抽取其中的信息：controller的名称，action的名称，参数等等，然后实例化一个controller，并调用其中的action来进行处理。

上一页 |  | 下一页
3.4. Zend_Config_Xml | 起始页 | 4.2. 入门