<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.controller.basics">
    <title>Основы Zend_Controller</title>

    <para>
        Система <classname>Zend_Controller</classname> спроектирована быть легковесной,
        модульной и расширяемой. Ее минимализм допускает гибкость и некоторую
        свободу в использовании, при этом она достаточно структурирована, чтобы
        системы, построенные с использованием <classname>Zend_Controller</classname>,
        использовали некоторые общие соглашения и сходное размещение кода.
    </para>

    <para>
        Следующая диаграмма отображает рабочий процесс системы, далее подробно
        описывается их взаимодействие:
    </para>

    <para>
        <inlinegraphic width="483" scale="100" align="center" valign="middle"
            fileref="figures/zend.controller.basics.png" format="PNG" />
    </para>

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

        <itemizedlist>
            <listitem>
                <para>
                    Фронт-контроллер (<classname>Zend_Controller_Front</classname>)
                    управляет всем рабочим процессом системы
                    <classname>Zend_Controller</classname>. Это одна из интерпретаций
                    паттерна FrontController. <classname>Zend_Controller_Front</classname>
                    обрабатывает все запросы, полученные сервером, и в конечном
                    счете отвечает за делегацию запросов контроллерам действий
                    (<classname>Zend_Controller_Action</classname>).
                </para>
            </listitem>

            <listitem>
                <para>
                    <classname>Zend_Controller_Request_Abstract</classname> (часто
                    называется <code>объектом запроса</code>) представляет
                    переменные запроса и предоставляет методы для установки и
                    получения имен контроллера, действия и любых параметров
                    запроса. Кроме того, он отслеживает, было ли обработано
                    содержащееся в нем действие диспетчером
                    <classname>Zend_Controller_Dispatcher</classname>.
                    Расширения абстрактного объекта запроса могут
                    использоваться для инкапсуляции всех переменных
                    запроса, позволяя роутерам извлекать информацию
                    из переменных запроса для того, чтобы устанавливать имена
                    контроллера и действия.
                </para>

                <para>
                    По умолчанию используется
                    <classname>Zend_Controller_Request_Http</classname>. Он
                    предоставляет доступ ко всем переменным HTTP-запроса.
                </para>
            </listitem>

            <listitem>
                <para>
                    <classname>Zend_Controller_Router_Interface</classname>
                    используется для описания маршрутизаторов.
                    Маршрутизация — это процесс исследования переменных запроса
                    для определения того, какой контроллер и какое действие в
                    этом контроллере должны получить этот запрос. Эти
                    контроллер, действие и опциональные параметры
                    устанавливаются в объекте запроса для обработки диспетчером
                    <classname>Zend_Controller_Dispatcher_Standard</classname>.
                    Маршрутизация производится только один раз: когда вначале
                    получен запрос и до того, как первый контроллер примет
                    управление.
                </para>

                <para>
                    Используемый по умолчанию маршрутизатор
                    <classname>Zend_Controller_Router_Rewrite</classname> принимает
                    конечную точку URI в том виде, в котором она определена в
                    <classname>Zend_Controller_Request_Http</classname>, и разлагает ее на
                    контроллер, действие и параметры, основываясь на пути в URL.
                    Например, URL
                    <code>http://localhost/foo/bar/key/value</code>
                    будет расшифрован следующим образом: контроллер
                    <code>foo</code>, действие <code>bar</code> и параметр
                    <code>key</code> со значением <code>value</code>.
                </para>

                <para>
                    <classname>Zend_Controller_Router_Rewrite</classname> может также
                    использоваться для сопоставления с произвольными путями,
                    за более подробной информацией см. <link
                    linkend="zend.controller.router">документацию по Rewrite
                    Router</link>
                </para>
            </listitem>

            <listitem>
                <para>
                    <classname>Zend_Controller_Dispatcher_Interface</classname>
                    используется для описания диспетчеров.
                    Диспетчеризация — это процесс извлечения контроллера и
                    действия из объекта запроса, нахождения соответствующих
                    файла/класса контроллера и метода действия в
                    классе контроллера. Ситуации, когда соответствующие
                    контроллер или действие не найдены, решаются
                    определением контроллеров и действий по умолчанию.
                </para>

                <para>
                    В действии процесс диспетчеризации состоит из
                    инстанцирования класса контроллера и вызова метода действия
                    в этом классе. В отличие от маршрутизации, которая
                    производится только один раз, диспетчеризация производится
                    циклически. Если флаг диспетчеризации объекта запроса
                    сбрасывается, то цикл будет повторяться, при этом вызывается
                    действие, которое будет установлено на данный момент в
                    объекте запроса. Если итерация цикла завершится с
                    установленным флагом диспетчеризации (значение
                    <constant>TRUE</constant>) в объекте запроса, то процесс
                    диспетчеризации завершается.
                </para>

                <para>
                    По умолчанию используется диспетчер
                    <classname>Zend_Controller_Dispatcher_Standard</classname>.
                    Он определяет контроллеры как классы с именами,
                    завершающимися словом Controller, и в которых все слова
                    начинаются со сточной буквы (MixedCase), методы действий —
                    как методы с именами, завершающимися словом Action, и в
                    которых все слова, кроме первого, начинаются со строчной
                    буквы (camelCase):
                    <code>SomeFooController::barAction</code>.
                    В этом случае на контроллер нужно ссылаться как на
                    <code>somefoo</code>, а на действие как на
                    <code>bar</code>.
                </para>

                <note>
                    <title>Соглашения по именованию</title>

                    <para>
                        Общеизвестно, что в случае ручного набора адресов
                        удобство и поддержка чувствительности регистра
                        несовместимы в принципе, поэтому Zend Framework приводит
                        пути в URL к нижнему регистру. Само собой, это влияет на
                        то, как вы именуете свои контроллеры и действия... или
                        ссылаетесь на них в URL.
                    </para>

                    <para>
                        Если вы хотите иметь классы контроллеров или методы
                        действий с именами, состоящими из нескольких слов,
                        разделенных в стиле MixedCase или camelCase, то нужно
                        разделить эти слова в URL с помощью '-' или '.' (можно
                        указать другой символ-разделитель).
                    </para>

                    <para>
                        Например, если вы собираетесь использовать действие
                        <code>FooBarController::bazBatAction()</code>, то должны
                        ссылаться на него в URL как на
                        <code>/foo-bar/baz-bat</code> или
                        <code>/foo.bar/baz.bat</code>.
                    </para>
                </note>
            </listitem>

            <listitem>
                <para>
                    <classname>Zend_Controller_Action</classname> — базовая
                    составляющая контроллера действий. Каждый контроллер
                    является отдельным классом, расширяющим
                    <classname>Zend_Controller_Action</classname>, и этот класс
                    должен содержать один или более методов действий.
                </para>
            </listitem>

            <listitem>
                <para>
                    <classname>Zend_Controller_Response_Abstract</classname>
                    определяет базовый класс ответа, используемый для
                    сбора и возвращения ответов из контроллеров действий.
                    Он собирает как тело ответа, так и заголовки.
                </para>

                <para>
                    По умолчанию используется класс
                    <classname>Zend_Controller_Response_Http</classname>, который
                    подходит для использования в среде HTTP.
                </para>
            </listitem>
        </itemizedlist>

    <para>
        Рабочий процесс <classname>Zend_Controller</classname> относительно простой.
        Запрос получается объектом <classname>Zend_Controller_Front</classname>,
        который в свою очередь вызывает
        <classname>Zend_Controller_Router_Rewrite</classname> для определения того, какой
        контроллер (и какое действие в этом контроллере) следует использовать.
        <classname>Zend_Controller_Router_Rewrite</classname>
        анализирует URI для установки имени контроллера и имени действия в
        запросе. Затем <classname>Zend_Controller_Front</classname> входит в цикл
        диспетчеризации. Он вызывает
        <classname>Zend_Controller_Dispatcher_Standard</classname>, передавая ему
        запрос для запуска контроллера и действия, определенных в запросе
        (или тех, которые используются по умолчанию). После того, как
        контроллер завершит работу, управление возвращается
        <classname>Zend_Controller_Front</classname>. Если предыдущий контроллер
        переустановкой статуса диспетчеризации в запросе
        указал, что должен быть запущен другой контроллер, то цикл
        продолжается и выполняется запуск другого контроллера. В противном
        случае процесс завершается.
    </para>
</sect1>

<!--
vim:se ts=4 sw=4 et:
-->
