目录
Zend_Controller
是Zend Framework的MVC体系的核心部份。MVC指Model-View-Controller,是一个用于分离应用逻辑和表现逻辑的设计模式。Zend_Controller_Front
实现了Front Controller设计模式,所有的请求都通过front controller(前端控制器)并分发(dispatch)到不同的控制器来处理,分发的过程基于请求的URL。
Zend_Controller
体系具有可扩展性,可以通过继承已有的类或者自己写个新的类来实现各种接口和抽象类,也可以编写插件或者助手类(helper)来增强系统的功能。
如果你想深入了解控制器,请认真看下面几节内容,如果你只是想快速地把系统搭建起来,看这一节。
首先你要规划好自己的文件结构布局,典型的结构是这样的:
application/ controllers/ IndexController.php models/ views/ scripts/ index/ index.phtml helpers/ filters/ html/ .htaccess index.php
创建html/.htaccess
,编辑其内容为:
RewriteEngine on RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
在上例中,所有请求(除了对那几个扩展名的文件的请求)都被转向到index.php。如果你想在访问某些扩展名的文件时不转向到index.php,你可以建立自己的URL重写规则,或者直接把扩展名添加到(|)之中去。
注意 | |
---|---|
上面的重写规则只能用于Apache服务器,如果你使用的是其它服务器,请查看 router的文档. |
(所谓Bootstrap,就相当于一小段引导程序或者入口程序,在ZF中,通常即指index.php,因为我们所有的请求都是从index.php进入的。--Haohappy注) 在设置好 .htaccess文件之后,建立一个新的文件index.php:
Zend_Controller_Front::run('/path/to/app/controllers');
这是一个入口文件,目的仅在于启动Zend_Controller_Front。Zend_Controller_Front用于分配请求到不同的控制器。
在讨论控制器之前,你应该先理解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
。
之前说过,视图脚本(即模板文件)放在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>
默认情况下,“错误处理器”插件 是已经被注册的。这个插件要求存在一个用于处理错误的控制器。它假设存在一个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>