第 4 章 Zend_Controller

目录

4.1. 概述
4.1.1. 简介
4.1.2. Route Process 路由过程
4.1.3. Token对象
4.1.4. Dispatch Process 分配过程
4.2. 入门
4.2.1. 简介
4.2.2. 服务器设置
4.2.3. Bootstrap文件
4.2.4. 目录结构
4.2.5. IndexController
4.3. 子类化(继承)
4.3.1. 简介
4.3.2. 约定(规则)
4.3.3. Router 接口
4.3.4. Dispatcher 接口
4.4. 插件
4.4.1. 简介

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来进行处理。