# Zend_Controller 快速入门

## 简介

`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

### 设置文件根目录

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

### 创建URL重写规则

创建`html/.htaccess`，编辑其内容为：

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

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

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

### 创建你的bootstrap文件

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

    Zend_Controller_Front::run('/path/to/app/controllers');

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

### 创建默认的控制器（Action Controller）

在讨论控制器之前，你应该先理解Zend Framework是如何处理HTTP请求的。默认情况下，URL的第一个部份会映射到一个控制器，第二个部份则映射到控制器类中的Action（即控制器类内部的一个方法）。例如：URL`http://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>

### 访问站点！

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

- `http://example.com/`

- `http://example.com/index`

- `http://example.com/index/index`

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