Глава 7. Zend_Controller

Содержание

7.1. Zend_Controller - Быстрый старт
7.1.1. Введение
7.1.2. Быстрый старт
7.1.2.1. Создайте свою файловую структуру
7.1.2.2. Установите корневую директорию для документов
7.1.2.3. Создайте свои правила перезаписи
7.1.2.4. Создайте свой файл загрузки
7.1.2.5. Создайте свой контроллер действий, используемый по умолчанию
7.1.2.6. Создайте свой скрипт вида
7.1.2.7. Создайте свой контроллер ошибок
7.1.2.8. Смотрим сайт!
7.2. Основы Zend_Controller
7.3. Фронт-контроллер
7.3.1. Обзор
7.3.2. Ключевые методы
7.3.2.1. getInstance()
7.3.2.2. setControllerDirectory() и addControllerDirectory()
7.3.2.3. dispatch()
7.3.2.4. run()
7.3.3. Методы-аксессоры для конфигурирования
7.3.4. Параметры фронт-контроллера
7.3.5. Создание подклассов фронт-контроллера
7.4. Объект запроса
7.4.1. Введение
7.4.2. HTTP-запросы
7.4.2.1. Доступ к данным запроса
7.4.2.2. Базовый URL и поддиректории
7.4.2.3. Определение HTTP-метода запроса
7.4.2.4. Определение запросов AJAX
7.4.3. Создание подклассов объекта запроса
7.5. Стандартный маршрутизатор: Zend_Controller_Router_Rewrite
7.5.1. Введение
7.5.2. Использование маршрутизатора
7.5.3. Базовые операции Rewrite Router
7.5.4. Маршруты по умолчанию
7.5.5. Базовый URL и поддиректории
7.5.6. Типы маршрутов
7.5.6.1. Zend_Controller_Router_Route
7.5.6.1.1. Значения переменных по умолчанию
7.5.6.1.2. Требования к переменным
7.5.6.2. Zend_Controller_Router_Route_Static
7.5.6.3. Zend_Controller_Router_Route_Regex
7.5.7. Использование Zend_Config вместе с RewriteRouter
7.5.8. Создание подклассов маршрутизатора
7.6. Диспетчер
7.6.1. Обзор
7.6.2. Создание подклассов диспетчера
7.7. Контроллеры действий
7.7.1. Введение
7.7.2. Инициализация объекта
7.7.3. Перехватчики Pre- и Post-Dispatch
7.7.4. Аксессоры
7.7.5. Интеграция вида
7.7.5.1. Инициализация вида
7.7.5.2. Рендеринг видов
7.7.6. Сервисные методы
7.7.7. Создание подклассов контроллера действий
7.8. Помощники действий
7.8.1. Введение
7.8.2. Инициализация помощника
7.8.3. Брокер помощников
7.8.4. Встроенные помощники действий
7.8.4.1. ActionStack
7.8.4.2. AutoComplete
7.8.4.2.1. Автодополнение c Dojo
7.8.4.2.2. Автодополнение с Scriptaculous
7.8.4.3. ContextSwitch and AjaxContext
7.8.4.3.1. Default Contexts Available
7.8.4.3.2. Creating Custom Contexts
7.8.4.3.3. Setting Contexts Per Action
7.8.4.3.4. Initializizing Context Switching
7.8.4.3.5. Additional Functionality
7.8.4.3.6. AjaxContext Functionality
7.8.4.4. FlashMessenger
7.8.4.4.1. Введение
7.8.4.4.2. Базовый пример использования
7.8.4.5. JSON
7.8.4.6. Redirector
7.8.4.6.1. Введение
7.8.4.6.2. Базовые примеры использования
7.8.4.7. ViewRenderer
7.8.4.7.1. Введение
7.8.4.7.2. API
7.8.4.7.3. Примеры базового использования
7.8.4.7.4. Примеры продвинутого использования
7.8.5. Написание собственных помощников
7.9. Объект ответа
7.9.1. Использование
7.9.2. Управление заголовками
7.9.3. Именованные сегменты
7.9.4. Проверка на исключения в объекте ответа
7.9.5. Создание подклассов объекта ответа
7.10. Плагины
7.10.1. Введение
7.10.2. Написание плагинов
7.10.3. Использование плагинов
7.10.4. Извлечение и работа с плагинами
7.10.5. Плагины, включенные в стандартную поставку
7.10.5.1. ActionStack
7.10.5.2. Zend_Controller_Plugins_ErrorHandler
7.10.5.2.1. Использование ErrorHandler в качестве обработчика ошибки 404
7.10.5.2.2. Управление сгенерированным ранее выводом
7.10.5.2.3. Примеры использования плагина
7.10.5.2.4. Пример контроллера ошибок
7.11. Использование определенной соглашением модульной структуры директорий
7.11.1. Введение
7.11.2. Определение директорий контроллеров в модулях
7.11.3. Маршрутизация применительно к модулям
7.11.4. Молуль или глобальный контроллер по умолчанию
7.12. Исключения
7.12.1. Введение
7.12.2. Как можно обрабатывать исключения?
7.12.3. Исключения в MVC, с которыми вы можете встретиться
7.13. Переход с предыдущих версий
7.13.1. Переход с 1.0.x на 1.5.0 и более поздние версии
7.13.2. Переход с 0.9.3 на 1.0.0RC1 и более поздние версии
7.13.3. Переход с 0.9.2 на 0.9.3 и более поздние версии
7.13.4. Переход с 0.6.0 на 0.8.0 и более поздние версии
7.13.5. Переход с 0.2.0 и более ранних версий на 0.6.0

7.1. Zend_Controller - Быстрый старт

7.1.1. Введение

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

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

7.1.2. Быстрый старт

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

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

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

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

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

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

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

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

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

Эти правила будут направлять запросы, не адресованные к ресурсам (изображения, css), ко фронт-контроллеру. Если есть файлы с другими расширениями, которые вы не хотите адресовать фронт-контроллеру (файлы PDF, текстовые файлы и т.д.), то добавьте также эти расширения в соответствующее правило или создайте собственные правила перезаписи.

[Замечание] Замечание

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

7.1.2.4. Создайте свой файл загрузки

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

<?php
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('/path/to/app/controllers');
            

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

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

До того, как начать обсуждение контроллеров действий, нужно сначала понять, как обрабатываются запросы в 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 и введите следующее:

<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';
 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.

7.1.2.6. Создайте свой скрипт вида

Как было упомянуто в предыдущем разделе, скрипты вида находятся в 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>
            

7.1.2.7. Создайте свой контроллер ошибок

По умолчанию зарегистрирован плагин-обработчик ошибок. Этот плагин ожидает, что есть контроллер для обработки ошибок. По умолчанию он предполагает, что в модуле, используемом по умолчанию, имеется контроллер ErrorController с методом errorAction.

<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';
 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>
            

7.1.2.8. Смотрим сайт!

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

  • http://example.com/

  • http://example.com/index

  • http://example.com/index/index

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

    Поддержать сайт на родительском проекте КГБ