Zend_Application-TheoryOfOperation.xml 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.application.theory-of-operation">
  4. <title>Теоретические основы работы с Zend_Application</title>
  5. <para>
  6. Получение сконфигурированного <acronym>MVC</acronym>-приложения,
  7. готового к обработке запроса,
  8. требует наличия дополнительного кода, объем которого зависит от
  9. используемого функционала:
  10. установка соединения с базой данных, конфигурирование видов и
  11. их помощников, конфигурирование макетов (layouts), регистрация плагинов,
  12. регистрация помощников действий и так далее.
  13. </para>
  14. <para>
  15. Кроме того, вы можете захотеть повторно использовать один и тот же код
  16. для загрузки тестов, сервисных скриптов, скриптов, предназначенных
  17. для запуска через крон.
  18. Можно просто добавлять свой скрипт загрузки, но часто встречаются
  19. инициализации, зависящие от окружения - например, для
  20. запуска через крон <acronym>MVC</acronym> может быть лишним, а для
  21. сервисного скрипта может быть достаточно только слоя баз данных.
  22. </para>
  23. <para>
  24. <classname>Zend_Application</classname> облегчает управление начальной
  25. загрузкой и способствует повторному использованию путем инкапсуляции
  26. загрузки в соответствии с парадигмой <acronym>ООП</acronym>.
  27. </para>
  28. <para>
  29. <classname>Zend_Application</classname> состоит из трех областей:
  30. </para>
  31. <itemizedlist>
  32. <listitem>
  33. <para>
  34. <classname>Zend_Application</classname>: загружает окружение
  35. <acronym>PHP</acronym>, включая include_paths и автозагрузку
  36. (autoloading), инстанцирует запрошенный загрузочный класс.
  37. </para>
  38. </listitem>
  39. <listitem>
  40. <para>
  41. <classname>Zend_Application_Bootstrap</classname>: предоставляет
  42. интерфейсы для загрузочных классов.
  43. <classname>Zend_Application_Bootstrap_Bootstrap</classname>
  44. предоставляет общий функционал, удовлетворяющий большинство
  45. нужд по начальной загрузке, включающие в себя алгоритмы проверки
  46. зависимостей и возможность загрузки ресурсов по требованию.
  47. </para>
  48. </listitem>
  49. <listitem>
  50. <para>
  51. <classname>Zend_Application_Resource</classname> предоставляет
  52. интерфейс для стандартных ресурсов загрузки,
  53. которые могут быть загружены по требованию через экземпляр
  54. загрузочного класса, и несколько реализаций ресурсов,
  55. используемых по умолчанию.
  56. </para>
  57. </listitem>
  58. </itemizedlist>
  59. <para>
  60. Разработчики могут создавать загрузочный класс для приложения,
  61. расширяя <classname>Zend_Application_Bootstrap_Bootstrap</classname>
  62. или, как минимум, реализуя интерфейс
  63. <classname>Zend_Application_Bootstrap_Bootstrapper</classname>.
  64. Входная точка (например, <filename>public/index.php</filename>)
  65. будет загружать <classname>Zend_Application</classname> и
  66. инстанцировать его путем передачи:
  67. </para>
  68. <itemizedlist>
  69. <listitem>
  70. <para>
  71. Текущего окружения
  72. </para>
  73. </listitem>
  74. <listitem>
  75. <para>
  76. Опций для загрузки
  77. </para>
  78. </listitem>
  79. </itemizedlist>
  80. <para>
  81. Опции загрузки включают в себя путь к файлу, содержащему в себе
  82. загрузочный класс и, опционально:
  83. </para>
  84. <itemizedlist>
  85. <listitem>
  86. <para>
  87. Любые дополнительные пути для добавления в include_path
  88. </para>
  89. </listitem>
  90. <listitem>
  91. <para>
  92. Любые дополнительные пространства имен автозагрузки,
  93. которые требуется зарегистрировать
  94. </para>
  95. </listitem>
  96. <listitem>
  97. <para>
  98. Любые установки <filename>php.ini</filename> для инициализации
  99. </para>
  100. </listitem>
  101. <listitem>
  102. <para>
  103. Имя класса загрузки (если используется имя, отличное от
  104. "Bootstrap")
  105. </para>
  106. </listitem>
  107. <listitem>
  108. <para>
  109. Пары префикс-путь для ресурсов
  110. </para>
  111. </listitem>
  112. <listitem>
  113. <para>
  114. Любые ресурсы для использования (указываются через имя класса
  115. или их короткое имя)
  116. </para>
  117. </listitem>
  118. <listitem>
  119. <para>
  120. Дополнительный путь к загружаемому конфигурационному файлу
  121. </para>
  122. </listitem>
  123. <listitem>
  124. <para>
  125. Дополнительные опции конфигурации
  126. </para>
  127. </listitem>
  128. </itemizedlist>
  129. <para>
  130. Опции могут быть массивом, объектом <classname>Zend_Config</classname>
  131. или путью к конфигурационному файлу.
  132. </para>
  133. <sect2 id="zend.application.theory-of-operation.bootstrap">
  134. <title>Начальная загрузка</title>
  135. <para>
  136. Второй областью отвественности компоненты
  137. <classname>Zend_Application</classname> является
  138. выполнение загрузки приложения. Загрузочные классы
  139. должны как минимум реализовывать интерфейс
  140. <classname>Zend_Application_Bootstrap_Bootstrapper</classname>,
  141. который определяет следующий <acronym>API</acronym>:
  142. </para>
  143. <programlisting language="php"><![CDATA[
  144. interface Zend_Application_Bootstrap_Bootstrapper
  145. {
  146. public function __construct($application);
  147. public function setOptions(array $options);
  148. public function getApplication();
  149. public function getEnvironment();
  150. public function getClassResources();
  151. public function getClassResourceNames();
  152. public function bootstrap($resource = null);
  153. public function run();
  154. }
  155. ]]></programlisting>
  156. <para>
  157. Этот API позволяет классу загрузки принимать окружение
  158. и конфигурацию из объекта приложения, определять ресурсы,
  159. за загрузку которых он отвечает, выполнять загрузку и запуск
  160. приложения.
  161. </para>
  162. <para>
  163. Вы можете сами реализовывать этот интерфейс, расширять
  164. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  165. или использовать
  166. <classname>Zend_Application_Bootstrap_Bootstrap</classname>.
  167. </para>
  168. <para>
  169. Кроме этого функционала есть и другие требующие внимания области,
  170. с которыми вы должны ознакомиться.
  171. </para>
  172. <sect3 id="zend.application.theory-of-operation.bootstrap.resource-methods">
  173. <title>Методы ресурсов</title>
  174. <para>
  175. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  176. предоставляет простое соглашение для определения
  177. методов ресурсов. Любой защищенный метод с именем,
  178. начинающимся с <emphasis>_init</emphasis>, будет считаться
  179. методом ресурса.
  180. </para>
  181. <para>
  182. Для того, чтобы запустить один метод ресурса, вызывайте
  183. метод <methodname>bootstrap()</methodname> с именем ресурса в
  184. качестве аргумента. Именем ресурса будет имя метода без префикса
  185. <emphasis>_init</emphasis>.
  186. </para>
  187. <para>
  188. Для того, чтобы запустить несколько методов ресурсов,
  189. передавайте массив имен. А для того, чтобы запустить
  190. все методы ресурсов, вызывайте метод без аргументов.
  191. </para>
  192. <para>
  193. Возьмем следующий загрузочный класс:
  194. </para>
  195. <programlisting language="php"><![CDATA[
  196. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  197. {
  198. protected function _initFoo()
  199. {
  200. // ...
  201. }
  202. protected function _initBar()
  203. {
  204. // ...
  205. }
  206. protected function _initBaz()
  207. {
  208. // ...
  209. }
  210. }
  211. ]]></programlisting>
  212. <para>
  213. Для того, чтобы запустить только метод
  214. <methodname>_initFoo()</methodname>, сделайте следующее:
  215. </para>
  216. <programlisting language="php"><![CDATA[
  217. $bootstrap->bootstrap('foo');
  218. ]]></programlisting>
  219. <para>
  220. Для того, чтобы запустить методы
  221. <methodname>_initFoo()</methodname> и
  222. <methodname>_initBar()</methodname>, сделайте следующее:
  223. </para>
  224. <programlisting language="php"><![CDATA[
  225. $bootstrap->bootstrap(array('foo', 'bar'));
  226. ]]></programlisting>
  227. <para>
  228. Для того, чтобы запустить все методы ресурсов,
  229. используйте <methodname>bootstrap()</methodname> без аргументов:
  230. </para>
  231. <programlisting language="php"><![CDATA[
  232. $bootstrap->bootstrap();
  233. ]]></programlisting>
  234. </sect3>
  235. <sect3 id="zend.application.theory-of-operation.bootstrap.resource-plugins">
  236. <title>Загрузки, использующие плагины ресурсов</title>
  237. <para>
  238. Для того, чтобы вы могли сделать свои загрузки более пригодными
  239. для повторного использования, мы реализовали возможность
  240. помещать свои ресурсы в классы-плагины ресурсов.
  241. Это позволит вам легко комбинировать ресурсы, используя
  242. конфигурацию.
  243. Ниже будет описание того, <link
  244. linkend="zend.application.theory-of-operation.resources">как
  245. создавать ресурсы</link>, в данном разделе мы только
  246. покажем, как использовать их.
  247. </para>
  248. <para>
  249. Если ваша загрузка должна поддерживать
  250. плагины ресурсов, то вам нужно реализовать дополнительный
  251. интерфейс
  252. <classname>Zend_Application_Bootstrap_ResourceBootstrapper</classname>.
  253. Этот интерфейс определяет <acronym>API</acronym> для
  254. определения местонахождения, регистрации и загрузки плагинов
  255. ресурсов:
  256. </para>
  257. <programlisting language="php"><![CDATA[
  258. interface Zend_Application_Bootstrap_ResourceBootstrapper
  259. {
  260. public function registerPluginResource($resource, $options = null);
  261. public function unregisterPluginResource($resource);
  262. public function hasPluginResource($resource);
  263. public function getPluginResource($resource);
  264. public function getPluginResources();
  265. public function getPluginResourceNames();
  266. public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader);
  267. public function getPluginLoader();
  268. }
  269. ]]></programlisting>
  270. <para>
  271. Плагины ресурсов в основном дают возможность
  272. создавать инициализаторы ресурсов, которые могут повторно
  273. использоваться в различных приложениях.
  274. Это позволит вам поддерживать порядок в вашей действующей
  275. загрузке и внедрять новые ресурсы без
  276. необходимости внесения изменений в собственно загрузке.
  277. </para>
  278. <para>
  279. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  280. (и, следовательно, наследующий от него класс
  281. <classname>Zend_Application_Bootstrap_Bootstrap</classname>)
  282. реализуют этот интерфейс, позволяя вам использовать
  283. плагины ресурсов.
  284. </para>
  285. <para>
  286. Для того, чтобы использовать плагины ресурсов, вы должны
  287. указывать их в опциях, передаваемых объектам приложения и/или
  288. загрузки. Эти опции могут указываться через конфигурационный
  289. файл или передаваться вручную.
  290. Опции будут массивом пар ключ/опции, где ключом является
  291. имя ресурса. Именем ресурса будет часть строки, следующая
  292. после префикса класса. Например,
  293. ресурсы, поставляемые c Zend Framework'ом, имеют префикс класса
  294. "<classname>Zend_Application_Resource_</classname>", все, что
  295. следует за ним, будет именем ресурса. Например:
  296. </para>
  297. <programlisting language="php"><![CDATA[
  298. $application = new Zend_Application(APPLICATION_ENV, array(
  299. 'resources' => array(
  300. 'FrontController' => array(
  301. 'controllerDirectory' => APPLICATION_PATH . '/controllers',
  302. ),
  303. ),
  304. ));
  305. ]]></programlisting>
  306. <para>
  307. Это означает, что должен использоваться ресурс
  308. "FrontController" с указанными опциями.
  309. </para>
  310. <para>
  311. Если вы планируете писать собственные плагины ресурсов
  312. либо добавить сторонние, то нужно будет указать вашей
  313. загрузке, где их искать.
  314. Внутри себя загрузка использует
  315. <classname>Zend_Loader_PluginLoader</classname>, поэтому
  316. достаточно указать префикс класса и путь к директории с
  317. плагинами ресурсов.
  318. </para>
  319. <para>
  320. Для примера предположим, что вы имеете свои плагины ресурсов
  321. в директории <filename>APPLICATION_PATH/resources/</filename>,
  322. и они используют общий префикс
  323. <classname>My_Resource</classname>.
  324. Вы можете передать эту информацию объекту приложения так,
  325. как показано ниже:
  326. </para>
  327. <programlisting language="php"><![CDATA[
  328. $application = new Zend_Application(APPLICATION_ENV, array(
  329. 'pluginPaths' => array(
  330. 'My_Resource' => APPLICATION_PATH . '/resources/',
  331. ),
  332. 'resources' => array(
  333. 'FrontController' => array(
  334. 'controllerDirectory' => APPLICATION_PATH . '/controllers',
  335. ),
  336. ),
  337. ));
  338. ]]></programlisting>
  339. <para>
  340. После этого вы можете использовать ресурсы из этой директории.
  341. </para>
  342. <para>
  343. Так же, как и в случае с методами ресурсов, вы используете
  344. метод <methodname>bootstrap()</methodname> для выполнения
  345. плагинов ресурсов.
  346. И точно так же вы можете указывать один плагин ресурса,
  347. несколько плагинов ресурсов (через массив), либо запускать все плагины
  348. сразу. Кроме того, вы можете комбинировать их с методами
  349. ресурсов.
  350. </para>
  351. <programlisting language="php"><![CDATA[
  352. // Выполнить один:
  353. $bootstrap->bootstrap('FrontController');
  354. // Выполнить несколько:
  355. $bootstrap->bootstrap(array('FrontController', 'Foo'));
  356. // Выполнить все ресурсы и плагины:
  357. $bootstrap->bootstrap();
  358. ]]></programlisting>
  359. </sect3>
  360. <sect3 id="zend.application.theory-of-operation.bootstrap.registry">
  361. <title>Реестр ресурсов</title>
  362. <para>
  363. Большинство, если не все, методы и плагины ресурсов
  364. будут инициализировать объекты, и во многих случаях эти
  365. объекты будут нужны где-то еще в приложении.
  366. Как получить к ним доступ?
  367. </para>
  368. <para>
  369. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  370. предоставляет локальный реестр для этих объектов.
  371. Для того, чтобы сохранять свои объекты в нем, просто возвращайте
  372. их из своего ресурса.
  373. </para>
  374. <para>
  375. Для большей гибкости этот реестр внутри себя ссылается на
  376. "контейнеры";
  377. единственное требование состоит в том, чтобы это был объект.
  378. Ресурсы регистрируются как свойства, имена которых совпадают
  379. с именами ресурсов.
  380. По умолчанию используется экземпляр
  381. <classname>Zend_Registry</classname>, но вы можете при
  382. желании указывать любой другой объект.
  383. Для работы с контейнерами могут использоваться методы
  384. <methodname>setContainer()</methodname> и
  385. <methodname>getContainer()</methodname>.
  386. Метод <methodname>getResource($resource)</methodname>
  387. может использоваться для извлечения ресурса из контейнера,
  388. а <methodname>hasResource($resource)</methodname> - для
  389. проверки того, был ли зарегистрирован данный ресурс.
  390. </para>
  391. <para>
  392. Для примера рассмотрим базовый ресурс вида:
  393. </para>
  394. <programlisting language="php"><![CDATA[
  395. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  396. {
  397. protected function _initView()
  398. {
  399. $view = new Zend_View();
  400. // дальнейшая инициализация...
  401. return $view;
  402. }
  403. }
  404. ]]></programlisting>
  405. <para>
  406. Вы можете затем проверять его наличие и/или извлекать его
  407. как показано ниже:
  408. </para>
  409. <programlisting language="php"><![CDATA[
  410. // Использование пары has/getResource()
  411. if ($bootstrap->hasResource('view')) {
  412. $view = $bootstrap->getResource('view');
  413. }
  414. // Через контейнер:
  415. $container = $bootstrap->getContainer();
  416. if (isset($container->view)) {
  417. $view = $container->view;
  418. }
  419. ]]></programlisting>
  420. <para>
  421. Следует заметить, что реестр и контейнер не являются
  422. глобальными. Это означает, что вам нужно иметь доступ к объекту
  423. загрузки с тем, чтобы можно было извлекать ресурсы.
  424. <classname>Zend_Application_Bootstrap_Bootstrap</classname>
  425. предоставляет некоторые удобства для этого:
  426. во время выполнения <methodname>run()</methodname> он
  427. регистрирует себя в качестве параметра "bootstrap"
  428. во фронт-контроллере, это позволяет извлекать его внутри
  429. маршрутизатора, диспетчера, плагинов и контроллеров действий.
  430. </para>
  431. <para>
  432. Например, если вы хотите внутри своего контроллера действий
  433. получить доступ к ресурсу вида из примеров выше, то
  434. можете сделать следующее:
  435. </para>
  436. <programlisting language="php"><![CDATA[
  437. class FooController extends Zend_Controller_Action
  438. {
  439. public function init()
  440. {
  441. $bootstrap = $this->getInvokeArg('bootstrap');
  442. $view = $bootstrap->getResource('view');
  443. // ...
  444. }
  445. }
  446. ]]></programlisting>
  447. </sect3>
  448. <sect3 id="zend.application.theory-of-operation.bootstrap.dependency-tracking">
  449. <title>Отслеживание зависимостей</title>
  450. <para>
  451. Кроме выполнения методов и плагинов ресурсов,
  452. необходимо также гарантировать, что они выполняются один и
  453. только один раз. Они предназначены для загрузки приложения,
  454. и выполнение их больше одного раза может привести к
  455. непроизводительному расходованию ресурсов.
  456. </para>
  457. <para>
  458. В то же время некоторые ресурсы могут зависеть от других и
  459. требовать их предварительной загрузки до начала своего
  460. выполнения.
  461. Для решения этих двух проблем
  462. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  463. предоставляет простой и эффективный механизм для отслеживания
  464. зависимостей.
  465. </para>
  466. <para>
  467. Как было сказано ранее, все ресурсы - как методы, так и
  468. плагины, - загружаются путем вызова
  469. <methodname>bootstrap($resource)</methodname>, где
  470. <varname>$resource</varname> является именем ресурса или
  471. массивом ресурсов. Если параметр <varname>$resource</varname>
  472. опущен, то это означает, что все ресурсы должны быть запущены.
  473. </para>
  474. <para>
  475. Если ресурс зависит от других ресурсов, то он должен вызывать
  476. метод <methodname>bootstrap()</methodname> в своем коде
  477. для обеспечения выполнения этих ресурсов.
  478. Последующие вызовы для этих ресурсов будут проигнорированы.
  479. </para>
  480. <para>
  481. В методе ресурса такой вызов будет выглядеть следующим образом:
  482. </para>
  483. <programlisting language="php"><![CDATA[
  484. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  485. {
  486. protected function _initRequest()
  487. {
  488. // Обеспечение инициализации контроллера
  489. $this->bootstrap('FrontController');
  490. // Извлечение фронт-контроллера из реестра загрузки
  491. $front = $this->getResource('FrontController');
  492. $request = new Zend_Controller_Request_Http();
  493. $request->setBaseUrl('/foo');
  494. $front->setRequest($request);
  495. // Обеспечение сохранения запроса в реестре загрузки
  496. return $request;
  497. }
  498. }
  499. ]]></programlisting>
  500. </sect3>
  501. </sect2>
  502. <sect2 id="zend.application.theory-of-operation.resources">
  503. <title>Плагины ресурсов</title>
  504. <para>
  505. <link linkend="zend.application.theory-of-operation.bootstrap.resource-plugins">Как
  506. было сказано ранее</link>,
  507. хорошим способом создания повторно используемых ресурсов загрузки
  508. и выделения кода в отдельные классы является
  509. использование плагинов ресурсов.
  510. Хотя Zend Framework поставляется с набором стандартных плагинов
  511. ресурсов, замысел состоит в том, что разработчики должны
  512. писать собственные плагины с целью инкапсуляции собственного
  513. кода, предназначенного для инициализации.
  514. </para>
  515. <para>
  516. Ресурсы должны только реализовывать интерфейс
  517. <classname>Zend_Application_Resource_Resource</classname> или, что
  518. является более простым вариантом, расширять абстрактный класс
  519. <classname>Zend_Application_Resource_ResourceAbstract</classname>.
  520. Базовый интерфейс довольно прост:
  521. </para>
  522. <programlisting language="php"><![CDATA[
  523. interface Zend_Application_Resource_Resource
  524. {
  525. public function __construct($options = null);
  526. public function setBootstrap(
  527. Zend_Application_Bootstrap_Bootstrapper $bootstrap
  528. );
  529. public function getBootstrap();
  530. public function setOptions(array $options);
  531. public function getOptions();
  532. public function init();
  533. }
  534. ]]></programlisting>
  535. <para>
  536. Он определяет только, что ресурс должен принимать опции
  537. через конструктор, иметь механизмы для установки/получения
  538. опций, механизмы для установки/получения объекта загрузочного класса
  539. и метод инициализации.
  540. </para>
  541. <para>
  542. Для примера предположим, что вы имеете инициализацию вида,
  543. одинаковую для нескольких ваших приложений. Вы используете в
  544. них одну и ту же декларацию DOCTYPE, одни и те же
  545. <acronym>CSS</acronym>-стили, скрипты JavaScript,
  546. а также хотите иметь возможность задавать базовый заголовок
  547. документа через конфигурацию.
  548. Ресурс, выполняющий такую инициализацию, может выглядеть следующим
  549. образом:
  550. </para>
  551. <programlisting language="php"><![CDATA[
  552. class My_Resource_View extends Zend_Application_Resource_ResourceAbstract
  553. {
  554. protected $_view;
  555. public function init()
  556. {
  557. // Возвращает вид, таким образом, он будет сохранен в реестре
  558. return $this->getView();
  559. }
  560. public function getView()
  561. {
  562. if (null === $this->_view) {
  563. $options = $this->getOptions();
  564. $title = '';
  565. if (array_key_exists('title', $options)) {
  566. $title = $options['title'];
  567. unset($options['title']);
  568. }
  569. $view = new Zend_View($options);
  570. $view->doctype('XHTML1_STRICT');
  571. $view->headTitle($title);
  572. $view->headLink()->appendStylesheet('/css/site.css');
  573. $view->headScript()->appendfile('/js/analytics.js');
  574. $viewRenderer =
  575. Zend_Controller_Action_HelperBroker::getStaticHelper(
  576. 'ViewRenderer'
  577. );
  578. $viewRenderer->setView($view);
  579. $this->_view = $view;
  580. }
  581. return $this->_view;
  582. }
  583. }
  584. ]]></programlisting>
  585. <para>
  586. Зарегистрировав путь к этому плагину ресурса, вы можете
  587. использовать его в своем приложении. Сверх того, благодаря
  588. использованию загрузчика плагинов вы эффективно
  589. переопределите идущий в поставке плагин ресурса "View", тем самым
  590. обеспечивая использование своего плагина вместо него.
  591. </para>
  592. </sect2>
  593. </sect1>