среда, 7 марта 2012 г.

Zend Framework -- Action Helpers настройка

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

Все эти плагины Front-контроллера, Action Helpers и контроллеры в комбинации с перехватчиками событий init(), preDispatch(), postDispatch() и прочих позволяют создать весьма гибкое и масштабируемое приложение. Для применения всех этих изысков неплохо иметь представление о том, как оно там "под капотом" работает.

При обработке запроса поступившего из браузера пользователя приложение выполняет целый ряд действий имеющих невидимый, но строгий порядок. Диаграмма подсмотренная в блоге Оскара Реалеса (Oscar Reales) проливает свет в некоторые темные уголки Zend Framework:

Как я понимаю - это часть цикла диспетчеризации, или последовательности событий в которых задействуются, или могут быть задействованы различные компоненты как из состава Zend Framework, так и сторонние, если они реализуют соответствующие интерфейсы.

Для начала определяю каталог (APPLICATION_PATH . '/controllers/helpers') для хранения собственных помощников действий как и советует Matthew Weier O'Phinney. Впрочем, это место оказывается ничем не лучше других. Обзываю класс Mazen_Action_Helper_Example, наследую его соответствующим образом, и сохраняю в файлик Example.php. Этот, несколько вызывающего вида, префикс отличает мои классы от всех других классов приложения.

Далее, в одном из методов _initActionHelpers() класса Bootstrap показываю Брокеру присматривающему за помощниками действий где их собственно искать. Такой способ, кстати, позволяет НЕ включать их местоположение в include_path:

Zend_Controller_Action_HelperBroker::addPath(
        APPLICATION_PATH . '/controllers/helpers', 'Mazen_Action_Helper'
);

Теперь в теле одного из Action можно вызвать моего помощника:

$this->_helper->Example();

Но тут мне захотелось выполнить некий код, который просится разместиться в методах init() всех Контроллеров. Даа, бывают у меня неадекватные желания... Смотрю в диаграмму выше, и понимаю, что записать этот код надо бы только один раз. У нас это называется "оставайся сухим" (принцип DRY). Видимо придется перехватить событие init() в том самом Брокере.

Создаю рядышком с помощником Example еще одного с именем Initializer. Но реализую в нем только один метод c именем перехватываемого события:

class Mazen_Action_Helper_Initializer extends Zend_Controller_Action_Helper_Abstract
{
    public function init()
    {
        // Здесь надо что-то сделать
    }
}

А в метод _initActionHelpers() класса Bootstrap добавляю новенький ресурс автозагрузчика:

$resourceLoader = new Zend_Loader_Autoloader_Resource(
        array(
            'basePath' => APPLICATION_PATH . '/controllers',
            'namespace' => 'Mazen_Action',
        )
);
$resourceLoader->addResourceType('helper', 'helpers/', 'Helper');

Без этого ценного ресурса приложение откажется создать экземплярчик нового помощника. Который просто таки необходимо предоставить в распоряжение Брокера:

Zend_Controller_Action_HelperBroker::addHelper(
        new Mazen_Action_Helper_Initializer()
);

Вуа-ля! И продолжение следует...

Комментариев нет:

Отправить комментарий