Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

ZEND FRAMEWORK: Шаблонные классы


PHP 5: Новые возможности.

В предлагаемом материале рассмотрен шаблонные классы - Zend_Controller и Zend_View, а также их работа по умолчанию.

Шаблонные классы реализуют две части шаблона проектирования MVC, на котором основывается Zend Framework, а именно: контроллер и вид (поддержку модели осуществляют, в основном, протокольно-сервисные классы).

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

Фактически, деятельность контроллера зависит не от самого класса Zend_Controller, а от целого ряда связанных с ним классов. Однако, в большинстве случаев эта деятельность протекает в автоматическом режиме, поэтому она остается преимущественно незаметной для разработчика. Ему, как известно, приходится только вызвать статический метод run() класса Zend_Controller_Front и унаследовать специализированные контроллеры от класса Zend_Controller_Action (см. Глава 4, Начало работы и Глава 22, Быстрый старт). Вот и все, что необходимо сделать.

При необходимости изменить функциональность отдельных звеньев контроллера существует возможность приспособить соответствующим образом и другие классы. Эта возможность более подробно будет рассмотрена в третьем томе (см. Глава 1, Класс Zend_Controller).

Класс Zend_View обеспечивает представление приложения, т. е. «видовую» часть шаблона проектирования MVC (в том числе, отделение функциональности этой части от двух других).

Класс позволяет работать с системами шаблонов (templates), например, Smarty, Flexy и т. п. Да и сам характер работы с классом напоминает эти системы.

По умолчанию объекты этого класса создаются и используются специализированным контроллером атоматически, но при необходимости разработчик может вмешаться в этот процесс. Так или иначе, использование класса Zend_View, в общих чертах, сводится к следующим двум шагам.

Этот класс принимает на себя весь поток запросов к приложению и организует их дальнейшую обработку; в частности, согласует работу Zend_Controller_Router и Zend_Controller_Dispatcher.

Если Zend Framework в целом воплощает шаблон проектирования MVC (см. Глава 1, Шаблон проектирования MVC), то класс Zend_Controller_Front реализует идеи двух других шаблонов: «Фасадного Контроллера» (Front Controller pattern) и «Одиночки» (Singleton pattern). В задачу первого входит инициализация окружения входящего запроса, его маршрутизация, диспетчеризация найденных акций, агрегация откликов и возврат результата (более подробно происходящие при этом процессы будут рассмотрены в третьем томе). Второй шаблон обеспечивает существование в любой момент времени одного и только одного экземпляра данного контроллера.

Для успешной работы фасадному контроллеру необходим один или несколько путей к специализированным контроллерам. Поэтому при вызове статического метода run() класса Zend_Controller_Front ему передается в качестве параметра строка (если путь к специализированным контроллерам один) или массив строк (если путей много).

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

По умолчанию фасадный контроллер способен к автоматическому отысканию и разбору скриптов вида, а также к обработке ошибочных ситуаций (см. Глава 4, Начало работы и Глава 22, Быстрый старт).

Для каждого приложения должен быть разработан контроллер «по умолчанию» - IndexController (см. «Роутинг»).

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

Наиболее стандартным действием при создании специализированных контроллеров является определение методов для обработки тех или иных действий. Эти действия задаются в запросе к серверу (см. «Роутинг») и автоматически направляются фасадным контроллером в одноименный метод (с окончанием Action()) заданного в том же запросе класса (см. Пример 8.1, «Запрос к серверу и его обработка»). Благодаря способности фасадного контроллера к автоматическому поиску и разбору скриптов вида методы специализированных контроллеров могут оставаться пустыми.

Каждый специализированный контроллер (кроме ErrorController, предназначенного для автоматической обработки ошибочных ситуаций) должен содержать определение метода indexAction() для обработки действия по умолчанию.

Определенный практический интерес представляет собой метод _getAllParams() класса Zend_Controller_Action, который возвращает все параметры и их значения, заданные в запросе к серверу, в виде ассоциативного массива.

Пример 8.1. Запрос к серверу и его обработка

http://www.example.com/foo/bar/op/blah/

class FooController extends Zend_Controller_Action
{
    /* ... */

    public function barAction()
    {
        $params = $this->_getAllParams();
        print $params['op'];
    }
}
            
blah

По умолчанию специализированный контроллер создает объект класса Zend_View автоматически. Этот объект доступен из контекста методов контроллера как его свойство $this->view. Также автоматически находится соответствующий данному методу скрипт вида (о пути поиска подробнее см. «Скрипты вида») и автоматически же выполняется разбор найденного скрипта. Однако, описанный процесс годится, в основном, для отображения статического контента.

Для отображения динамического контента контроллер должен передать виду необходимые для отображения данные. Это производится путем установки определенных свойств объекта класса Zend_View в скрипте контроллера, которые впоследствии используются скриптом вида. Если данные ассоциированы в массиве или другом объекте, можно воспользоваться методом assign() класса Zend_View.

Пример 8.2. Передача данных объекту вида

http://www.example.com/foo/bar/op/blah/

class FooController extends Zend_Controller_Action
{
    /* ... */

    public function barAction()
    {
        $this->view->action = 'bar';    1
        $this->view->assign($this->_getAllParams());    2
    }
}
            

1

Непосредственная установка свойства объекта вида.

2

Назначение данных при помощи метода Zend_View::assign().


Поскольку скрипт вида исполняется одним из методов объекта Zend_View, то он имеет доступ к свойствам этого объекта, а именно они, как нам известно, представляют собой данные для отображения, переданные скрипту вида специализированным контроллером (см. Пример 8.2, «Передача данных объекту вида»).

Пример 8.3. Использование скриптом вида полученных данных


<?php

$action = $this->escape($this->action); 1
$op = $this->escape($this->op);

print <<<EOT
Action:  $action
Operand: $op
EOT;
            

1

Полученные данные следует отображать в безопасном виде, для чего служит метод Zend_View::escape(). По умолчанию он использует стандартную функцию htmlspecialchars().


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

    [Подсказка]Подсказка

    Для получения заданных значений операндов используйте метод Zend_Controller_Action::_getAllParams(). Вычисления и вывод результата для простоты проделайте в пределах самого контроллера, не отвлекаясь на создание видов и модели.

  2. Добавьте разработанный контроллер и скрипты вида в соответствующие директории на своем сайте; проверьте их работоспособность.

    [Подсказка]Подсказка

    При необходимости внесите изменения в файл .htaccess.

«Ответы и решения к Глава 8, Шаблонные классы»

Created with DocBook


В избранное