Глава 4. Zend_Controller
Пред. |  | След.

## Глава 4. Zend_Controller

## 4.1. Обзор

### 4.1.1. Введение

`Zend_Controller` предоставляет основу для построения веб-сайта, базирующегося на паттерне Model-View-Controller (MVC).

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

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

- `Zend_Controller_Front` управляет всем рабочим процессом системы `Zend_Controller`. Это интерпретация паттерна FrontController. `Zend_Controller_Front` обрабатывает все запросы, полученные сервером, и в конечном счете овечает за делегацию запросов "контроллерам действий" (`Zend_Controller_Action`).

- `Zend_Controller_Router` является маршрутизатором. Маршрутизация -- это процесс приема конечной точки URI и ее декомпозиции для определения, какой контроллер и какое действие данного контроллера должны получить запрос. Определение контроллера, действия и необязательных параметров упаковано в объект значений, называемый `Zend_Controller_Dispatcher_Token` (маркер диспетчеризации). Далее идет обработка посредством `Zend_Controller_Dispatcher`. Маршрутизация выполняется только один раз: когда вначале получен запрос и перед тем, как первый контроллер будет запущен.

- `Zend_Controller_Dispatcher` является диспетчером. Диспетчеризация -- процесс получения объекта `Zend_Controller_Dispatcher_Token`, нахождения соответствующего файла контроллера, инициализации класса контроллера в этом файле (должен выполнять `Zend_Controller_Action`) и, наконец, запуска метода действия в объекте контроллера. В отличие от маршрутизации, которая выполняется только один раз, диспетчеризация выполняется циклически.`Zend_Controller_Dispatcher` повторно вызывается `Zend_Controller_Front` до тех пор, все действия не будут последовательно выполнены.

- `Zend_Controller_Action` является базовой компонентой контроллера. Каждый контроллер -- отдельный класс, который наследует от класса `Zend_Controller_Action`, и этот класс имеет методы, реализующие действия.

Рабочий процесс `Zend_Controller` относительно простой. Запрос принимается объектом `Zend_Controller_Front`, который по очереди вызывает `Zend_Controller_Router` для определения, какой контроллер (и какое действие в этом контроллере) запускать. `Zend_Controller_Router` декомпозирует URI в объект `Zend_Controller_Dispatcher_Token`, который описывает, что запускать. Затем `Zend_Controller_Front` входит в цикл диспетчеризации. Он вызывает `Zend_Controller_Dispatcher`, переданный в объекте `Zend_Controller_Dispatcher_Token`, для запуска нужного контроллера и действия. После того, как контроллер завершит работу, управление возвращается `Zend_Controller_Front`. Если предыдущий контроллер посредством возвращения нового маркера указал, что должен быть запущен другой контроллер, то цикл продолжается и выполняется другой запуск. В противном случае процесс завершается.

### 4.1.2. Процесс маршрутизации

Перед тем, как писать свой первый контроллер, надо сначала понять, как работает процесс маршрутизации, и как это реализовано в `Zend_Controller_Router`. Помните, что рабочий процесс разделен на маршрутизацию, которая выполняется только один раз, и диспетчеризацию, которая впоследствии выполняется в цикле.

`Zend_Controller_Front` вызывает `Zend_Controller_Router` для установки того, какой контроллер (и какое действие внутри этого контроллера) соответствует данному URI. `Zend_Controller_Router` принимает URI и декомпозирует его в объект значений `Zend_Controller_Dispatcher_Token`, который будет передан диспетчеру (`Zend_Controller_Dispatcher`).

Маршрутизатор использует очень простую схему для определения имени контроллера и имени действия в контроллере:

    http://framework.zend.com/controller/action/

Обратите внимание, что первый сегмент всегда является именем контроллера, а второй сегмент -- именем действия.

В URI могут быть определены параметры, которые будут переданы контроллеру. Они имеют вид пары ключ/значение:

    http://framework.zend.com/controller/action/key1/value1/

Если ничего не размещено в части URI `/controller/`, то это будет "`index`". Если ничего не размещено в части URI `/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 (URI rewriting), который даст намного более гибкие возможности, что сейчас доступны в маршрутизаторе. Это будет включено в предварительном релизе в очень близком будущем.

Имя контроллера, имя действия в этом контроллере и необязательные параметры упакованы в маркер `Zend_Controller_Dispatcher_Token`. Этот маркер возвращается для `Zend_Controller_Front`, который тогда входит в цикл "диспетчеризации". Один раз за весь цикл диспетчеризации маркер будет передан `Zend_Controller_Dispatcher`.

### 4.1.3. Маркер диспетчеризации

Маркер диспетчеризации (dispatch token) -- простой объект значений, который передается между `Zend_Controller_Front` и классами, которые реализуют интерфейсы маршрутизатора и диспетчера. Он упаковывает в себе определение контроллера, действия и параметров, передаваемых действию.

- Имя контроллера доступно через `getControllerName()` и `setControllerName()`.

- Имя действия, вызываемого внутри контроллера, доступно через `getActionName()` и `setActionName()`.

- Параметры, передаваемые данному действию, заключены в ассоциативный массив из пар ключ/значение, который доступен через `getParams()` и `setParams()`.

### 4.1.4. Процесс диспетчеризации

Диспетчеризация -- процесс получения маркера `Zend_Controller_Dispatcher_Token`, извлечения информации, заключенной в нем: имени контроллера, имени действия и необязательных параметров, затем инициализации контроллера и вызова действия в этом контроллере.

Пред. |  | След.
3.4. Zend_Config_Xml | Начало | 4.2. Начало работы