| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect1 id="zend.controller.actionhelpers" xmlns:xi="http://www.w3.org/2001/XInclude">
- <title>Помощники действий</title>
- <sect2 id="zend.controller.actionhelper.introduction">
- <title>Введение</title>
- <para>
- Помощники действий (action helpers) дают разработчикам возможность
- добавлять функционал во время выполнения или по требованию в любые
- контроллеры действий, которые наследуют от
- <classname>Zend_Controller_Action</classname>.
- Помощники действий помогают снизить необходимость в наследовании от
- абстрактного контроллера действий при добавлении общего
- функционала в контроллер действий.
- </para>
- <para>
- Есть несколько вариантов использования помощников действий.
- Помощники действий используют брокерскую систему (brokerage system),
- подобную той, которая используется в
- <link linkend="zend.view.helpers">Zend_View_Helper</link> и
- <link linkend="zend.controller.plugins">Zend_Controller_Plugin</link>.
- Помощники действий (как и <classname>Zend_View_Helper</classname>) могут быть
- загружены и вызваны по требованию, либо инстанцироваться во время
- запроса (начальной загрузки) или создания контроллера действий
- (init()). Для того, чтобы лучше разобраться с этим, см. ниже раздел
- по использованию.
- </para>
- </sect2>
- <sect2 id="zend.controller.actionhelper.initialization">
- <title>Инициализация помощника</title>
- <para>
- Помощник может быть инициализирован несколькими различными
- способами, выбор способа зависит от ваших нужд и от
- функционала, предоставляемого этим помощником.
- </para>
- <para>
- Брокер помощников хранится как член <varname>$_helper</varname> класса
- <classname>Zend_Controller_Action</classname>; используйте брокер для
- получения или вызова помощников. Методы для этого включают в себя:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Явное использование метода <code>getHelper()</code>. Просто
- передайте ему имя, и будет возвращен объект помощника:
- </para>
- <programlisting language="php"><![CDATA[
- $flashMessenger = $this->_helper->getHelper('FlashMessenger');
- $flashMessenger->addMessage('We did something in the last request');
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- Используйте функционал "волшебного" метода
- <code>__get()</code> брокера помощников - извлекайте
- помощника так же, как если бы он был свойством этого брокера:
- </para>
- <programlisting language="php"><![CDATA[
- $flashMessenger = $this->_helper->FlashMessenger;
- $flashMessenger->addMessage('We did something in the last request');
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- И наконец, большинство помощников действий реализует метод
- <code>direct()</code>, который будет вызывать особый,
- используемый по умолчанию метод в помощнике. Например, в
- случае <code>FlashMessenger</code> будет вызван метод
- <code>addMessage()</code>:
- </para>
- <programlisting language="php"><![CDATA[
- $this->_helper->FlashMessenger('We did something in the last request');
- ]]></programlisting>
- </listitem>
- </itemizedlist>
- <note>
- <para>
- Все примеры выше функционально эквивалентны.
- </para>
- </note>
- <para>
- Вы можете также явно инстанцировать помощников. Вы можете захотеть
- сделать это, если используете помощника вне контроллера действий,
- или если хотите передавать помощника брокеру для использования в
- любых действиях. Инстанцирование производится так же, как и для
- любого другого класса PHP.
- </para>
- </sect2>
- <sect2 id="zend.controller.actionhelper.broker">
- <title>Брокер помощников</title>
- <para>
- <classname>Zend_Controller_Action_HelperBroker</classname> управляет
- регистрацией объектов помощников и путей к помощникам, а также
- извлечением помощников по требованию.
- </para>
- <para>
- Для того, чтобы зарегистрировать помощника через брокер, используйте
- <code>addHelper</code>:
- </para>
- <programlisting language="php"><![CDATA[
- Zend_Controller_Action_HelperBroker::addHelper($helper);
- ]]></programlisting>
- <para>
- Само собой, инстанцирование и передача помощников брокеру отнимают
- некоторое время и ресурсы, поэтому существуют два метода для
- некоторой автоматизации: <code>addPrefix()</code> и
- <code>addPath()</code>.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <code>addPrefix()</code> принимает префикс класса и
- использует его для определения пути, по которому определен
- класс помощника. Подразумевается, что префикс следует
- соглашениям по именованию классов Zend Framework-а.
- </para>
- <programlisting language="php"><![CDATA[
- // Добавление помощников, начинающихся
- // с My_Action_Helpers в My/Action/Helpers/
- Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <code>addPath()</code> принимает директорию в качестве
- первого аргумента и префикс класса в качестве второго (по
- умолчанию это 'Zend_Controller_Action_Helper'). Это
- позволяет поставить в соответствие определенным
- директориям собственные префиксы классов.
- </para>
- <programlisting language="php"><![CDATA[
- // Добавление помощников, начинающихся с Helper в Plugins/Helpers/
- Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
- 'Helper');
- ]]></programlisting>
- </listitem>
- </itemizedlist>
- <para>
- Поскольку эти методы статические, то они могут вызываться из любого
- места в цепочке контроллеров для динамического добавления
- помощников при необходимости.
- </para>
- <para>
- Внутри себя брокер помощников использует <link
- linkend="zend.loader.pluginloader">экземпляр PluginLoader</link>
- для поддержки путей. Вы можете извлечь PluginLoader, используя
- статический метод <code>getPluginLoader()</code>, или
- добавить свой экземпляр PluginLoader, используя
- <code>setPluginLoader()</code>.
- </para>
- <para>
- Для определения того, есть ли помощник в брокере, используйте
- <code>hasHelper($name)</code>, где <varname>$name</varname> - короткое
- имя помощника без префикса:
- </para>
- <programlisting language="php"><![CDATA[
- // Проверка, зарегистрирован ли помощник 'redirector' в брокере:
- if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
- echo 'Redirector helper registered';
- }
- ]]></programlisting>
- <para>
- Есть также два статических метода для извлечения помощников из
- брокера помощников: <code>getExistingHelper()</code> и
- <code>getStaticHelper()</code>. <code>getExistingHelper()</code>
- будет извлекать помощника только если он был ранее вызван или явно
- зарегистрирован через брокер помощников, иначе бросается исключение.
- <code>getStaticHelper()</code> делает то же самое, что и
- <code>getExistingHelper()</code>, за тем исключением, что будет
- пытаться инстанцировать помощника, если он еще не был
- зарегистрирован в стеке помощников. <code>getStaticHelper()</code>
- является хорошим выбором, если нужно извлечь помощника для конфигурирования.
- </para>
- <para>
- Оба метода принимают единственный аргумент, <varname>$name</varname>,
- который является коротким именем помощника (без префикса).
- </para>
- <programlisting language="php"><![CDATA[
- // Проверка, зарегистрирован ли помощник 'redirector' в брокере,
- // и его извлечение:
- if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
- $redirector =
- Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
- }
- // Или просто извлеките его, не заботясь о том,
- // был ли он ранее зарегистрирован:
- $redirector =
- Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
- }
- ]]></programlisting>
- <para>
- Наконец, для удаления зарегистрированного помощника из брокера
- используйте <code>removeHelper($name)</code>, где <varname>$name</varname>
- - короткое имя помощника без префикса:
- </para>
- <programlisting language="php"><![CDATA[
- // Удаление помощника 'redirector' из брокера, помещенное
- // в условную конструкцию
- if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
- Zend_Controller_Action_HelperBroker::removeHelper('redirector')
- }
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.controller.actionhelper.stockhelpers">
- <title>Встроенные помощники действий</title>
- <para>
- Zend Framework уже содержит в себе набор помощников действий:
- <code>AutoComplete</code> автоматизирует ответы для автозавершения
- ввода с использованием AJAX; <code>ContextSwitch</code> и
- <code>AjaxContext</code> для обслуживания альтернативных форматов
- ответов для ваших действий; <code>FlashMessenger</code> для
- управления сессионными сообщениями; <code>Json</code> для
- кодирования и отправки ответов JSON; <code>Redirector</code>,
- предоставляющий различные реализации перенаправления из вашего
- приложения на внутренние и внешние страницы; и
- <code>ViewRenderer</code>, автоматизирующий процесс настройки
- объекта вида в контроллерах и рендеринга видов.
- </para>
- <xi:include href="Zend_Controller-ActionHelpers-ActionStack.xml">
- <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ActionStack.xml" /></xi:fallback>
- </xi:include>
- <xi:include href="Zend_Controller-ActionHelpers-AutoComplete.xml">
- <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-AutoComplete.xml" /></xi:fallback>
- </xi:include>
- <xi:include href="Zend_Controller-ActionHelpers-ContextSwitch.xml">
- <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ContextSwitch.xml" /></xi:fallback>
- </xi:include>
- <xi:include href="Zend_Controller-ActionHelpers-FlashMessenger.xml">
- <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-FlashMessenger.xml" /></xi:fallback>
- </xi:include>
- <xi:include href="Zend_Controller-ActionHelpers-Json.xml">
- <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-Json.xml" /></xi:fallback>
- </xi:include>
- <xi:include href="Zend_Controller-ActionHelpers-Redirector.xml">
- <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-Redirector.xml" /></xi:fallback>
- </xi:include>
- <xi:include href="Zend_Controller-ActionHelpers-ViewRenderer.xml">
- <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ViewRenderer.xml" /></xi:fallback>
- </xi:include>
- </sect2>
- <sect2 id="zend.controller.actionhelper.writingyourown">
- <title>Написание собственных помощников</title>
- <para>
- Помощники действий наследуют от абстрактного класса
- <classname>Zend_Controller_Action_Helper_Abstract</classname>,
- который предоставляет базовый интерфейс и функционал, необходимые
- для использования с брокером помощников. Он включает в себя
- следующие методы:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <code>setActionController()</code> используется для
- установки текущего контроллера действий.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>init()</code>, запускаемый брокером при
- инстанцировании, может использоваться для запуска
- инициализации в помощнике. Это может быть полезным для
- переустановки состояния, когда несколько контроллеров
- используют один и тот же помощник в цепочке действий.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>preDispatch()</code> запускается до того, как будет
- запущено действие.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>postDispatch()</code> запускается, когда
- выполнение действия завершилось - даже если
- плагин <code>preDispatch()</code> пропустил это действие.
- Полезно в основном для очистки.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>getRequest()</code> возвращает текущий объект запроса.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>getResponse()</code> возвращает текущий объект ответа.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>getName()</code> возвращает имя помощника. Он
- извлекает ту часть имени класса, которая следует после
- последнего символа подчеркивания, иначе возвращается полное
- имя класса. Например, если класс называется
- <classname>Zend_Controller_Action_Helper_Redirector</classname>,
- то он вернет <code>Redirector</code>, а если класс называется
- <code>FooMessage</code> то он просто вернет свое полное имя.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Вы можете опционально добавить метод <code>direct()</code> в свой
- класс помощника. Если он определен, то это позволит вам обращаться к
- помощнику как к методу брокера помощников, этим обеспечивается
- легкое единовременное использование помощника. Например,
- <link linkend="zend.controller.actionhelpers.redirector">redirector</link>
- определяет <code>direct()</code> как псевдоним метода
- <code>goto()</code>, что позволяет использовать помощника следующим
- образом:
- </para>
- <programlisting language="php"><![CDATA[
- // Перенаправление на /blog/view/item/id/42
- $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
- ]]></programlisting>
- <para>
- Метод брокера помощников <code>__call()</code> ищет помощника с
- именем <code>redirector</code>, затем смотрит, имеет ли помощник
- определенный метод <code>direct</code>, и, если есть, вызывает его с
- переданными аргументами.
- </para>
- <para>
- Создав собственный класс помощника, вы можете предоставить доступ к
- нему, как описано в разделах выше.
- </para>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|