| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- <?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:
- -->
|