# Zend_Controller - Быстрый старт

## Введение

`Zend_Controller` является ядром системы MVC в Zend Framework. Аббревиатура MVC - сокращение от Model-View-Controller (модель-вид-контроллер), это паттерн проектирования, предназначенный для отделения логики приложения от логики представления. `Zend_Controller_Front` реализует паттерн Front Controller, в котором все запросы перехватываются фронт-контроллером (front controller) и перенаправляются отдельным контроллерам действий (action controllers), выбор которых производится по запрошенному URL.

Система `Zend_Controller` построена с расчетом на расширяемость как через наследование от уже существующих классов и написание новых классов, реализующих различные интерфейсы и абстрактные классы, образующих основу семейства классов контроллеров, так и через написание плагинов или помощников действий для наращивания функциональности системы или управления ею.

## Быстрый старт

Если вам нужна более подробная информация, то сразу переходите к следующим разделам. Если хотите быстро начать работать с `Zend_Controller`, то читайте далее.

### Создайте файловую структуру

Первый шаг состоит в том, чтобы создать файловую структуру приложения. Ниже приведено типовое решение:

    application/
        controllers/
            IndexController.php
        models/
        views/
            scripts/
                index/
                    index.phtml
            helpers/
            filters/
    html/
        .htaccess
        index.php

### Установите корневую директорию для документов

В своем веб-сервере установите директорию `html` из приведенной выше структуры в качестве корневой для веб-документов.

### Создайте свои правила перезаписи

Отредактируйте файл `html/.htaccess` из приведенной выше структуры следующим образом:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]

#### Узнайте больше о mod_rewrite

Приведенные выше правила перезаписи позволяют получить доступ к любому файлу в корневой для веб-документов директории вашего виртуального хоста. Если в ней есть файлы, которые нужно скрыть от посторонних глаз, то вы наверное захотите установить более строгие правила. Перейдите на сайт Apache, чтобы узнать больше о mod_rewrite.

Если у вас IIS 7.0, то используйте следующую конфигурацию перезаписи:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
         <system.webServer>
             <rewrite>
                 <rules>
                     <rule name="Imported Rule 1" stopProcessing="true">
                         <match url="^.*$" />
                         <conditions logicalGrouping="MatchAny">
                             <add input="{REQUEST_FILENAME}"
                                 matchType="IsFile" pattern=""
                                 ignoreCase="false" />
                             <add input="{REQUEST_FILENAME}"
                                 matchType="IsDirectory"
                                 pattern="" ignoreCase="false" />
                         </conditions>
                         <action type="None" />
                     </rule>
                     <rule name="Imported Rule 2" stopProcessing="true">
                         <match url="^.*$" />
                         <action type="Rewrite" url="index.php" />
                     </rule>
                 </rules>
             </rewrite>
         </system.webServer>
    </configuration>

Эти правила перезаписи пропускают запросы к существующим ресурсам (существующие символьные ссылки, непустые файлы и директории), все остальные запросы перенаправляются к фронт-контроллеру.

Вышеприведенные правила перезаписи предназначены для веб-сервера Apache. За примерами правил перезаписи для других веб-серверов см. документацию по маршрутизаторам.

### Создайте файл загрузки

Файл загрузки - это страница, на которую направляются все запросы, в нашем случае это `html/index.php`. Откройте `html/index.php` в любом текстовом редакторе и добавьте следующие строки:

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

Этот код выполняет инстанцирование и запуск фронт-контроллера, который будет направлять запросы к контроллерам действий.

### Создайте свой контроллер действий, используемый по умолчанию

До того, как начать обсуждение контроллеров действий, нужно сначала понять, как обрабатываются запросы в Zend Framework. По умолчанию первая часть пути в URL соответствует контроллеру, а вторая - действию. Например, дан URL `http://framework.zend.com/roadmap/components`. В нем путь `/roadmap/components` будет соответствовать контроллеру `roadmap` и действию `components`. Если не передано имя действия, то предполагается действие `index`; если не передано имя контроллера, то предполагается контроллер `index` (по соглашению Apache это соответствует `DirectoryIndex`).

Диспетчер `Zend_Controller`-а принимает значение контроллера и находит соответствующий ему класс. По умолчанию это имя контроллера, начинающееся с заглавной буквы и со словом `Controller` в конце. Таким образом, контроллер `roadmap` будет соответствовать классу `RoadmapController`.

Аналогичным образом устанавливается соответствие значения действия методу класса контроллера. По умолчанию значение приводится к нижнему регистру и к нему присоединяется слово `Action`. Таким образом, в нашем примере выше действие `components` будет методом с именем `componentsAction`, и в итоге вызов метода будет выглядеть следующим образом: `RoadmapController::componentsAction()`.

Итак, двигаемся дальше. Теперь приступим к созданию контроллера и действия, используемых по умолчанию. Как было замечено ранее, эти контроллер и действие должны оба называться `index`. Откройте файл `application/controllers/IndexController.php` и введите следующее:

    /** Zend_Controller_Action */
    class IndexController extends Zend_Controller_Action
    {
        public function indexAction()
        {
        }
    }

По умолчанию включен помощник действий ViewRenderer. Это означает, что, просто определив метод действия и соответствующий скрипт вида, вы получите рендеринг контента. По умолчанию в MVC в качестве "вида" используется `Zend_View`. `render()` использует имя контроллера (например, `index`) и имя текущего действия (например, `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`.

    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>Error</title>
    </head>
    <body>
        <h1>An error occurred</h1>
        <p>An error occurred; please try again later.</p>
    </body>
    </html>

### Смотрим сайт!

Теперь, имея свои первые контроллер и вид, вы можете запустить свой броузер и просматривать сайт. Если ваш домен - `example.com`, то любой из следующих URL-ов будет возвращать ту страницу, которую вы только что создали:

- `http://example.com/`

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

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

Теперь вы можете приступить к созданию других контроллеров и методы действий. Поздравляем!