Zend_Application-TheoryOfOperation.xml 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.application.theory-of-operation">
  5. <title>Teoría de Operación</title>
  6. <para>
  7. Obtener una aplicación
  8. <acronym>MVC</acronym>
  9. configurada y lista para funcionar
  10. requiere de un porcentaje cada vez mayor de código que
  11. disponga
  12. de más características, tales como: Establecer la base de datos,
  13. configurar la vista
  14. y los ayudantes(helpers) de vistas, configurar los layouts,
  15. registro de plugins, registro de
  16. ayudantes de acción (action helpers), y mucho más.
  17. </para>
  18. <para>
  19. Además, a menudo deseará reutilizar el mismo código para arrancar sus
  20. pruebas, un cronjob, o
  21. un servicio en linea de comandos.
  22. Si bien es posible incluir simplemente su script bootstrap,
  23. a menudo hay inicializaciones que son específicas del entorno,
  24. puede que no necesite el
  25. <acronym>MVC</acronym>
  26. para un cronjob, o simplemente
  27. la capa de DB para un servicio script.
  28. </para>
  29. <para>
  30. <classname>Zend_Application</classname>
  31. pretende hacer esto más fácil
  32. y promover la reutilización mediante el encapsulamiento del
  33. bootstraping en paradigmas de
  34. <acronym>OOP</acronym>
  35. .
  36. </para>
  37. <para>
  38. Zend_Application está dividida en tres áreas:
  39. </para>
  40. <itemizedlist>
  41. <listitem>
  42. <para>
  43. <classname>Zend_Application</classname>
  44. : carga el entono
  45. de
  46. <acronym>PHP</acronym>
  47. , incluyendo include_paths y autocarga,
  48. e instancia la clase requerida de bootstrap.
  49. </para>
  50. </listitem>
  51. <listitem>
  52. <para>
  53. <classname>Zend_Application_Bootstrap</classname>
  54. : suministra
  55. interfaces para las clases bootstrap.
  56. <classname>Zend_Application_Bootstrap_Bootstrap</classname>
  57. ofrece funcionalidad común para la mayoría de las necesidades
  58. de bootstrap,
  59. incluyendo algoritmos de comprobación de
  60. dependencias y la capacidad de cargar
  61. recursos de bootstrap
  62. por demanda.
  63. </para>
  64. </listitem>
  65. <listitem>
  66. <para>
  67. <classname>Zend_Application_Resource</classname>
  68. provee una
  69. interfaz para recursos estandar de bootstrap que pueden ser
  70. cargados por
  71. demanda mediante una instancia bootstrap,
  72. así como implementaciones de varios
  73. recursos por defecto.
  74. </para>
  75. </listitem>
  76. </itemizedlist>
  77. <para>
  78. Los desarrolladores crean una clase de arranque(bootstrap) para sus
  79. aplicaciones, extendiendo
  80. <classname>Zend_Application_Bootstrap_Bootstrap</classname>
  81. o
  82. implementando (mínimamente)
  83. <classname>Zend_Application_Bootstrap_Bootstrapper</classname>
  84. . El punto de entrada
  85. (por ejemplo, public/index.php) cargará
  86. <classname>Zend_Application</classname>
  87. ,
  88. y la instanciará pasando por:
  89. </para>
  90. <itemizedlist>
  91. <listitem>
  92. <para>
  93. El entorno actual
  94. </para>
  95. </listitem>
  96. <listitem>
  97. <para>
  98. Opciones para bootstrapping
  99. </para>
  100. </listitem>
  101. </itemizedlist>
  102. <para>
  103. Las opciones de bootstrap incluyen la ruta hacia el archivo que
  104. contiene la clase bootstrap
  105. y opcionalmente:
  106. </para>
  107. <itemizedlist>
  108. <listitem>
  109. <para>
  110. Cualquier include_paths extras a establecer
  111. </para>
  112. </listitem>
  113. <listitem>
  114. <para>
  115. Cualquier otro namespace de autocarga adicional a registrar
  116. </para>
  117. </listitem>
  118. <listitem>
  119. <para>
  120. Cualquier configuración de
  121. <filename>php.ini</filename>
  122. a inicializar
  123. </para>
  124. </listitem>
  125. <listitem>
  126. <para>
  127. El nombre de clase para la clase bootstrap (si no es "Bootstrap")
  128. </para>
  129. </listitem>
  130. <listitem>
  131. <para>
  132. Pares de recursos prefijo de ruta a usar
  133. </para>
  134. </listitem>
  135. <listitem>
  136. <para>
  137. Cualquier recurso a usar (por nombre de clase o nombre corto)
  138. </para>
  139. </listitem>
  140. <listitem>
  141. <para>
  142. Ruta adicional al archivo de configuración a cargar
  143. </para>
  144. </listitem>
  145. <listitem>
  146. <para>
  147. Opciones adicionales de configuración
  148. </para>
  149. </listitem>
  150. </itemizedlist>
  151. <para>
  152. Las opciones puden ser una array, un objeto
  153. <classname>Zend_Config</classname>
  154. , o la ruta a un archivo de
  155. configuración.
  156. </para>
  157. <sect2 id="zend.application.theory-of-operation.bootstrap">
  158. <title>Bootstrapping</title>
  159. <para>
  160. La segunda área de responsabilidad de
  161. <classname>Zend_Application</classname>
  162. es ejecutar la solicitud
  163. del bootstrap. Los bootstraps necesitan mínimamente implementar
  164. <classname>Zend_Application_Bootstrap_Bootstrapper</classname>
  165. ,
  166. la que define la siguiente
  167. <acronym>API</acronym>
  168. :
  169. </para>
  170. <programlisting language="php"><![CDATA[
  171. interface Zend_Application_Bootstrap_Bootstrapper
  172. {
  173. public function __construct($application);
  174. public function setOptions(array $options);
  175. public function getApplication();
  176. public function getEnvironment();
  177. public function getClassResources();
  178. public function getClassResourceNames();
  179. public function bootstrap($resource = null);
  180. public function run();
  181. }
  182. ]]></programlisting>
  183. <para>
  184. Esta
  185. <acronym>API</acronym>
  186. permite aceptar al bootstrap en el entorno y la
  187. configuración desde el objeto de la
  188. aplicación, informa la
  189. responsabilidad de los recursos para los recursos bootstraping,
  190. luego hace el bootstrap y ejecuta la aplicación.
  191. </para>
  192. <para>
  193. Puede implementar esta interfaz usted mismo, extendiendo
  194. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  195. ,
  196. o usar
  197. <classname>Zend_Application_Bootstrap_Bootstrap</classname>
  198. .
  199. </para>
  200. <para>
  201. Además de esta funcionalidad, hay muchas otras áreas de
  202. incumbencia con las cuales debe
  203. familiarizarse.
  204. </para>
  205. <sect3 id="zend.application.theory-of-operation.bootstrap.resource-methods">
  206. <title>Métodos Recursos</title>
  207. <para>
  208. La implementación de
  209. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  210. proporciona una simple convención para definir métodos de
  211. recursos de clase.
  212. Cualquier método protegido cuyo nombre
  213. comience con un prefijo
  214. <emphasis>_init</emphasis>
  215. será considerado
  216. un método de recurso.
  217. </para>
  218. <para>
  219. Para arrancar un único método de recurso, utilizar el método
  220. <methodname>bootstrap()</methodname>
  221. , y pasarle el nombre del recurso.
  222. El nombre será el nombre de método menos el
  223. prefijo
  224. <emphasis>_init</emphasis>
  225. .
  226. </para>
  227. <para>
  228. Para arrancar varios métodos de recursos, pasar un array de
  229. nombres. Para bootstrap
  230. de todos los métodos de recursos,
  231. no pasar nada.
  232. </para>
  233. <para>
  234. Tome las siguientes clases bootstrap:
  235. </para>
  236. <programlisting language="php"><![CDATA[
  237. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  238. {
  239. protected function _initFoo()
  240. {
  241. // ...
  242. }
  243. protected function _initBar()
  244. {
  245. // ...
  246. }
  247. protected function _initBaz()
  248. {
  249. // ...
  250. }
  251. }
  252. ]]></programlisting>
  253. <para>
  254. Para arrancar solo el método
  255. <methodname>_initFoo()</methodname>
  256. , haga lo
  257. siguiente:
  258. </para>
  259. <programlisting language="php"><![CDATA[
  260. $bootstrap->bootstrap('foo');
  261. ]]></programlisting>
  262. <para>
  263. Para arrancar los métodos
  264. <methodname>_initFoo()</methodname>
  265. y
  266. <methodname>_initBar()</methodname>
  267. , haga lo siguiente:
  268. </para>
  269. <programlisting language="php"><![CDATA[
  270. $bootstrap->bootstrap(array('foo', 'bar));
  271. ]]></programlisting>
  272. <para>
  273. Para arrancar todos los métodos de recursos, llame a
  274. <methodname>bootstrap()</methodname>
  275. sin argumentos:
  276. </para>
  277. <programlisting language="php"><![CDATA[
  278. $bootstrap->bootstrap();
  279. ]]></programlisting>
  280. </sect3>
  281. <sect3 id="zend.application.theory-of-operation.bootstrap.resource-plugins">
  282. <title>Bootstraps que usan plugins de recursos</title>
  283. <para>
  284. Para hacer más re-utilizables sus bootstraps, hemos
  285. proporcionado la capacidad de
  286. impulsar sus recursos dentro de
  287. las clases de recursos de plugin. Esto le permite
  288. combinar
  289. recursos simplemente via configuración. Cubriremos el tema
  290. <link linkend="zend.application.theory-of-operation.resources">cómo
  291. crear recursos</link>
  292. más adelante; en esta sección le
  293. mostraremos sólo cómo utilizarlos.
  294. </para>
  295. <para>
  296. Si su bootstrap debe ser capaz de utilizar recursos de plugins,
  297. necesitará
  298. implementar una interfaz adicional,
  299. <classname>Zend_Application_Bootstrap_ResourceBootstrapper</classname>
  300. .
  301. Esta interfaz define una
  302. <acronym>API</acronym>
  303. para localizar, registrar,
  304. y cargar recursos de plugins:
  305. </para>
  306. <programlisting language="php"><![CDATA[
  307. interface Zend_Application_Bootstrap_ResourceBootstrapper
  308. {
  309. public function registerPluginResource($resource, $options = null);
  310. public function unregisterPluginResource($resource);
  311. public function hasPluginResource($resource);
  312. public function getPluginResource($resource);
  313. public function getPluginResources();
  314. public function getPluginResourceNames();
  315. public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader);
  316. public function getPluginLoader();
  317. }
  318. ]]></programlisting>
  319. <para>
  320. Básicamente los recursos de plugins ofrecen la posibilidad de
  321. crear recursos
  322. incializadores que puede ser re-utilizados entre
  323. aplicaciones. Esto le permite
  324. mantener su actual bootstrap
  325. relativamente limpio, e introducir nuevos recursos
  326. sin
  327. necesidad de tocar su propio arranque (bootstrap).
  328. </para>
  329. <para>
  330. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  331. (y
  332. <classname>Zend_Application_Bootstrap_Bootstrap</classname>
  333. por extensión)
  334. implementan esta interfaz, que le permite utilizar recursos de
  335. plugins.
  336. </para>
  337. <para>
  338. Para utilizar recursos de plugins, debe especificarlos en las
  339. opciones que pasó al
  340. objeto aplicación y/o bootstrap.
  341. Estas opciones pueden provenir de un archivo de
  342. configuración,
  343. o ser pasadas manualmente.
  344. Las opciones deberán ser pares de
  345. clave/opción, representando
  346. con la clave el nombre del recurso. El nombre de recurso
  347. será
  348. el segmento siguiente al prefijo de clase.
  349. Por ejemplo, los recursos que vienen
  350. con Zend Framework
  351. tienen el prefijo de clase "Zend_Application_Resource_";
  352. cualquier
  353. cosa que le siga después debe ser el nombre del recurso.
  354. Como por ejemplo,
  355. </para>
  356. <programlisting language="php"><![CDATA[
  357. $application = new Zend_Application(APPLICATION_ENV, array(
  358. 'resources' => array(
  359. 'FrontController' => array(
  360. 'controllerDirectory' => APPLICATION_PATH . '/controllers',
  361. ),
  362. ),
  363. ));
  364. ]]></programlisting>
  365. <para>
  366. Esto indica que el recurso "Front Controller", debería ser
  367. utilizado, con las
  368. opciones especificadas.
  369. </para>
  370. <para>
  371. Si usted comienza a escribir su propio recurso de plugin,
  372. o utilizar recursos de
  373. plugin de terceras partes,
  374. necesitará decirle a su bootstrap donde encontrarlos.
  375. Internamente, el bootstrap utiliza
  376. <classname>Zend_Loader_PluginLoader</classname>
  377. , de manera tal
  378. que sólo necesitará indicar el prefijo de la clase común como
  379. pares de
  380. path.
  381. </para>
  382. <para>
  383. Supongamos por ejemplo, que usted tiene recursos de plugins
  384. personalizados en
  385. <filename>APPLICATION_PATH/resources/</filename>
  386. y que
  387. ellos comparten el prefijo de clase común
  388. <classname>My_Resource</classname>
  389. .
  390. Entonces, debería pasar esa información al objeto aplicación
  391. de la siguiente manera:
  392. </para>
  393. <programlisting language="php"><![CDATA[
  394. $application = new Zend_Application(APPLICATION_ENV, array(
  395. 'pluginPaths' => array(
  396. 'My_Resource' => APPLICATION_PATH . '/resources/',
  397. ),
  398. 'resources' => array(
  399. 'FrontController' => array(
  400. 'controllerDirectory' => APPLICATION_PATH . '/controllers',
  401. ),
  402. ),
  403. ));
  404. ]]></programlisting>
  405. <para>
  406. Ahora usted está habilitado para utilizar los recursos de
  407. ese directorio.
  408. </para>
  409. <para>
  410. Tal como los métodos de recursos, utilice el método bootstrap()
  411. para ejecutar
  412. recursos de plugins. También tal como con los
  413. métodos de recursos, puede especificar
  414. bien un único recurso de
  415. plugin, múltiples plugins (vía un array), o todos los
  416. plugins.
  417. Además, los puede combinar para ejecutar métodos de recursos.
  418. </para>
  419. <programlisting language="php"><![CDATA[
  420. // Ejecute uno:
  421. $bootstrap->bootstrap('FrontController');
  422. // Ejecute varios:
  423. $bootstrap->bootstrap(array('FrontController', 'Foo'));
  424. // Ejecute todos los métodos de recursos y plugins:
  425. $bootstrap->bootstrap();
  426. ]]></programlisting>
  427. </sect3>
  428. <sect3 id="zend.application.theory-of-operation.bootstrap.registry">
  429. <title>Registro de Recursos</title>
  430. <para>
  431. Muchos, si no todos, sus métodos de recursos o plugins
  432. inicializarán objetos y, en
  433. muchos casos, estos objetos serán
  434. necesarios en otros lugares de su aplicación.
  435. ¿Cómo
  436. se puede acceder a ellos?
  437. </para>
  438. <para>
  439. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  440. ofrece un registro local para estos objetos. Para almacenar sus
  441. objetos en ellos,
  442. simplemente debe devolverlos desde sus recursos.
  443. </para>
  444. <para>
  445. Para máxima flexibilidad, este registro es mencionado
  446. internamente como un
  447. "contenedor"; el único requisito es que
  448. sea un objeto. Los recursos son luego
  449. registrados como
  450. propiedades nombrados después del nombre del recurso.
  451. Por defecto,
  452. una instancia de
  453. <classname>Zend_Registry</classname>
  454. es utilizada, pero
  455. también puede especificar cualquier otro objeto que desee.
  456. Los
  457. métodos
  458. <methodname>setContainer()</methodname>
  459. y
  460. <methodname>getContainer()</methodname>
  461. pueden ser utilizados para manipular el contenedor en si mismo.
  462. <methodname>getResource($resource)</methodname>
  463. puede ser utilizado para
  464. recuperar un recurso determinado del contenedor, y
  465. <methodname>hasResource($resource)</methodname>
  466. para verificar si el
  467. recurso ha sido efectivamente registrado.
  468. </para>
  469. <para>
  470. Como ejemplo, considere una visión básica del recurso:
  471. </para>
  472. <programlisting language="php"><![CDATA[
  473. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  474. {
  475. protected function _initView()
  476. {
  477. $view = new Zend_View();
  478. // más inicialización...
  479. return $view;
  480. }
  481. }
  482. ]]></programlisting>
  483. <para>
  484. A continuación, puede comprobarlos y/o traerlos así:
  485. </para>
  486. <programlisting language="php"><![CDATA[
  487. // Usando el par has/getResource():
  488. if ($bootstrap->hasResource('view')) {
  489. $view = $bootstrap->getResource('view');
  490. }
  491. // Via el contenedor:
  492. $container = $bootstrap->getContainer();
  493. if (isset($container->view)) {
  494. $view = $container->view;
  495. }
  496. ]]></programlisting>
  497. <para>
  498. Tenga en cuenta que el registro y el contenedor no es global.
  499. Esto significa que
  500. usted necesita acceso al bootstrap a fin de
  501. recuperar recursos.
  502. <classname>Zend_Application_Bootstrap_Bootstrap</classname>
  503. proporciona cierta comodidad para ello: durante las ejecución de
  504. <methodname>run()</methodname>
  505. se registra a sí mismo como el "Front
  506. Controller" en el parámetro del "bootstrap",
  507. que permite
  508. buscarlo desde el router, despachador, plugins, y los
  509. contoladores de
  510. acción.
  511. </para>
  512. <para>
  513. Como ejemplo, si quiere tener acceso a los recursos de la
  514. vista desde dentro de su
  515. controlador de acción, podría
  516. hacer lo siguiente:
  517. </para>
  518. <programlisting language="php"><![CDATA[
  519. class FooController extends Zend_Controller_Action
  520. {
  521. public function init()
  522. {
  523. $bootstrap = $this->getInvokeArg('bootstrap');
  524. $view = $bootstrap->getResource('view');
  525. // ...
  526. }
  527. }
  528. ]]></programlisting>
  529. </sect3>
  530. <sect3 id="zend.application.theory-of-operation.bootstrap.dependency-tracking">
  531. <title>Localización de las Dependencias</title>
  532. <para>
  533. Además de ejecutar los métodos de recursos métodos y plugins,
  534. es necesario
  535. garantizar que estos son ejecutados una vez y solo
  536. una vez; esto es lo que se
  537. pretende con el bootstrap de una
  538. aplicación, y ejecutarlo múltiples veces puede
  539. conducir a
  540. una sobrecarga de recursos.
  541. </para>
  542. <para>
  543. Al mismo tiempo, algunos recursos puede depender de otros
  544. que están en ejecución.
  545. Para resolver estas dos cuestiones,
  546. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  547. proporciona un mecanismo simple pero eficaz para la localización
  548. de dependencias.
  549. </para>
  550. <para>
  551. Como se señaló anteriormente, todos los recursos --
  552. ya sean métodos o plugins -- son
  553. arrancados llamando a
  554. <methodname>bootstrap($resource)</methodname>
  555. , dende
  556. <varname>$resource</varname>
  557. es el nombre de un recurso, un array de recursos,
  558. o si se dejó vacío, indica que
  559. deberían ejecutarse todos los recursos.
  560. </para>
  561. <para>
  562. Si un recurso depende de otro recurso, debe llamar a
  563. <methodname>bootstrap()</methodname>
  564. dentro de su código para garantizar
  565. que ese recurso ha sido ejecutado.
  566. Las llamadas
  567. subsiguientes a él, serán ignoradas.
  568. </para>
  569. <para>
  570. En un método de recursos, esa llamada sería parecida a lo siguiente:
  571. </para>
  572. <programlisting language="php"><![CDATA[
  573. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  574. {
  575. protected function _initRequest()
  576. {
  577. // Asegurar que el front controller es inicializado
  578. $this->bootstrap('FrontController');
  579. // Recuperar el front controller desde el registro de bootstrap
  580. $front = $this->getResource('FrontController');
  581. $request = new Zend_Controller_Request_Http();
  582. $request->setBaseUrl('/foo');
  583. $front->setRequest($request);
  584. // Garantizar que la solicitud es almacenada en el registro de bootstrap
  585. return $request;
  586. }
  587. }
  588. ]]></programlisting>
  589. </sect3>
  590. </sect2>
  591. <sect2 id="zend.application.theory-of-operation.resources">
  592. <title>Plugins de Recursos</title>
  593. <para>
  594. <link linkend="zend.application.theory-of-operation.bootstrap.resource-plugins">Como se señaló anteriormente</link>
  595. ,
  596. una buena forma de crear recursos de bootstrap re-utilizables y a
  597. traspasar mucha de su
  598. codificación a clases discretas es utilizar
  599. plugins de recursos. Si bien Zend Framework
  600. se entrega con una
  601. serie de plugins de recursos, la intención es que los
  602. desarrolladores
  603. deberían escribir los suyos para encapsular
  604. sus propias necesidades de inicialización.
  605. </para>
  606. <para>
  607. Los recursos plugins solo necesitan implemetar
  608. <classname>Zend_Application_Resource_Resource</classname>
  609. , o
  610. más simple aún, extenderse
  611. <classname>Zend_Application_Resource_ResourceAbstract</classname>
  612. .
  613. La interfaz básica es simplemente esto:
  614. </para>
  615. <programlisting language="php"><![CDATA[
  616. interface Zend_Application_Resource_Resource
  617. {
  618. public function __construct($options = null);
  619. public function setBootstrap(
  620. Zend_Application_Bootstrap_Bootstrapper $bootstrap
  621. );
  622. public function getBootstrap();
  623. public function setOptions(array $options);
  624. public function getOptions();
  625. public function init();
  626. }
  627. ]]></programlisting>
  628. <para>
  629. La interfaz define simplemente que un recurso plugin debe aceptar opciones
  630. para el
  631. constructor, tiene mecanismos de establecer y recuperar
  632. opciones, mecanismos de
  633. establecer y recuperar el objeto bootstrap,
  634. y un método de inicialización.
  635. </para>
  636. <para>
  637. Como ejemplo, supongamos que tiene una vista común de inicialización
  638. que utiliza en sus
  639. aplicaciones. Usted tiene un doctype común,
  640. <acronym>CSS</acronym>
  641. y JavaScript, y quiere se capaz de pasar desde un documento base el
  642. título via
  643. configuración. Un recurso plugin tal podría ser como este:
  644. </para>
  645. <programlisting language="php"><![CDATA[
  646. class My_Resource_View extends Zend_Application_Resource_ResourceAbstract
  647. {
  648. protected $_view;
  649. public function init()
  650. {
  651. // Regresa la vista de manera que bootstrap la almacenará en el registro
  652. return $this->getView();
  653. }
  654. public function getView()
  655. {
  656. if (null === $this->_view) {
  657. $options = $this->getOptions();
  658. $title = '';
  659. if (array_key_exists('title', $options)) {
  660. $title = $options['title'];
  661. unset($options['title']);
  662. }
  663. $view = new Zend_View($options);
  664. $view->doctype('XHTML1_STRICT');
  665. $view->headTitle($title);
  666. $view->headLink()->appendStylesheet('/css/site.css');
  667. $view->headScript()->appendfile('/js/analytics.js');
  668. $viewRenderer =
  669. Zend_Controller_Action_HelperBroker::getStaticHelper(
  670. 'ViewRenderer'
  671. );
  672. $viewRenderer->setView($view);
  673. $this->_view = $view;
  674. }
  675. return $this->_view;
  676. }
  677. }
  678. ]]></programlisting>
  679. <para>
  680. Minetrtas usted haya registrado el path del prefijo para este
  681. recurso de plugin, puede
  682. usarlo en su aplicación. Mejor aún,
  683. ya que usa el cargador de plugin, usted está pasando
  684. por encima del
  685. recurso de plugin de la "View" que viene con Zend Framework,
  686. se está
  687. asegurando así que usa el suyo en lugar del original.
  688. </para>
  689. </sect2>
  690. </sect1>