Zend_Controller是Zend Framework的MVC体系的核心部份。MVC指Model-View-Controller,是一个用于分离应用逻辑和表现逻辑的设计模式。Zend_Controller_Front实现了Front Controller设计模式,所有的请求都通过front controller(前端控制器)并分发(dispatch)到不同的控制器来处理,分发的过程基于请求的URL。
Zend_Controller体系具有可扩展性,可以通过继承已有的类或者自己写个新的类来实现各种接口和抽象类,也可以编写插件或者助手类(helper)来增强系统的功能。
 
在讨论控制器之前,你应该先理解Zend Framework是如何处理HTTP请求的。默认情况下,URL的第一个部份会映射到一个控制器,第二个部份则映射到控制器类中的Action(即控制器类内部的一个方法)。例如:URLhttp://framework.zend.com/roadmap/components,其服务器路径为/roadmap/components,则会映射到roadmap控制器和components Action。如果不存在action,则会调用index这个action。如果控制器不存在,则会自动调用index控制器。(按照Apache的命名惯例,自动映射到DirectoryIndex文件)
 
Zend_Controller_Front自己注册了一个插件经纪人(plugin broker),允许插件观测它所触发的各种事件。大多数情况下,这将使得开发人员有机会裁剪站点的分发过程,而无需通过扩展前端控制器增加功能。
 
Zend_Controller的工作流相当简单。请求被Zend_Controller_Front接收,然后它调用Zend_Controller_Router_Rewrite来决定哪个控制器(和控制器中的动作)被派遣。为了在请求中设置控制器和动作名字Zend_Controller_Router_Rewrite分解URI。Zend_Controller_Front接着进入一个派遣循环。它调用Zend_Controller_Dispatcher_Standard,传递给它请求,派遣在请求(或使用缺省的)中指定的控制器和动作。在控制器完成之后,控制返回到Zend_Controller_Front。如果控制器通过重置请求派遣状态指示其它的控制器应该被派遣,循环将继续并且其它派遣被执行。否则,处理结束。
默认的行为
默认地,前端控制器加载ErrorHandler插件,以及ViewRenderer动作助手,分别为了简化控制器中的错误处理和视图渲染。
如需禁用ErrorHandler,调用dispatch()前执行下面代码:
// Disable the ErrorHandler plugin:
$front->setParam('noErrorHandler', true);
            
如需禁用ViewRenderer,调用dispatch()前执行下面代码:
// Disable the ViewRenderer helper:
$front->setParam('noViewRenderer', true);
 
默认情况下,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
 
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory('../application/controllers');
/**
$front->setControllerDirectory(array(
    'default' => '../application/controllers',
    'blog'    => '../modules/blog/controllers',
    'news'    => '../modules/news/controllers',
));
*/
 
请求对象:
 
特定的超全局变量也可以选择特定的方法来访问,如$_POST['user']可以调用请求对象的getPost('user')访问,getQuery()可以获取$_GET元素,getHeader()可以获取请求消息头。