Некоторые моменты при работе с плагинами, ресурсами и помощниками действий создаваемых для нужд собственного приложения. Вот так потратишь пару десятков часов на знакомство с архитектурными изысками, что потом будет обидно позабыть некоторые оригинальные решения.
Все эти плагины 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() );
Вуа-ля! И продолжение следует...
Комментариев нет:
Отправить комментарий