Zend_Controller-FrontController.xml 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17175 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.front">
  5. <title>El Front Controller</title>
  6. <sect2 id="zend.controller.front.overview">
  7. <title>Introducción</title>
  8. <para>
  9. <classname>Zend_Controller_Front</classname>
  10. implementa un
  11. <ulink url="http://www.martinfowler.com/eaaCatalog/frontController.html">Front Controller
  12. pattern</ulink>
  13. usado en aplicaciones
  14. <ulink url="http://en.wikipedia.org/wiki/Model-view-controller">Model-View-Controller
  15. (MVC)</ulink>
  16. . Su propósito es inicializar el entorno de la solicitud, rutear la
  17. solicitud entrante, y
  18. luego hacer un envío de cualquier de las acciones descubiertas; le
  19. agrega las respuestas
  20. y las regresa cuando se completa el proceso.
  21. </para>
  22. <para>
  23. <classname>Zend_Controller_Front</classname>
  24. también implementa el
  25. <ulink url="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton pattern</ulink>
  26. ,
  27. significando que solo una única instancia de él puede estar disponible en cualquier
  28. momento dado. Esto le permite actuar también como un registro en el que los demás
  29. objetos pueden extraer del proceso dispatch.
  30. </para>
  31. <para>
  32. <classname>Zend_Controller_Front</classname>
  33. registra un
  34. <link linkend="zend.controller.plugins">plugin broker</link>
  35. consigo mismo, permitiendo
  36. que diversos eventos que dispara sean observados por plugins.
  37. En muchos casos, esto da
  38. el desarrollador la oportunidad de adaptar el proceso de
  39. dispatch al sitio sin la
  40. necesidad de ampliar el Front Controller para añadir
  41. funcionalidad.
  42. </para>
  43. <para>
  44. Como mínimo, el front controller necesita una o más paths a directorios que contengan
  45. <link linkend="zend.controller.action"> action controllers</link>
  46. a fin de hacer su
  47. trabajo. Una variedad de métodos también pueden ser invocados para
  48. seguir adaptando el
  49. medio ambiente del front controller y ese a sus helper classes.
  50. </para>
  51. <note>
  52. <title>Comportamiento por Defecto</title>
  53. <para>
  54. Por defecto, el front controller carga el
  55. <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
  56. plugin, así como al
  57. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  58. action helper plugin. Estos son para simplificar el manejo
  59. de errores y el view
  60. renderering en sus controladores, respectivamente.
  61. </para>
  62. <para>
  63. Para deshabilitar el
  64. <emphasis>ErrorHandler</emphasis>
  65. , ejecutar lo siguiente en
  66. cualquier momento antes de llamar a
  67. <methodname>dispatch()</methodname>
  68. :
  69. </para>
  70. <programlisting language="php"><![CDATA[
  71. // Deshabilitar el ErrorHandler plugin:
  72. $front->setParam('noErrorHandler', true);
  73. ]]></programlisting>
  74. <para>
  75. Para deshabilitar el
  76. <emphasis>ViewRenderer</emphasis>
  77. , haga lo siguiente antes
  78. de llamar a
  79. <methodname>dispatch()</methodname>
  80. :
  81. </para>
  82. <programlisting language="php"><![CDATA[
  83. // Deshabilitar el ViewRenderer helper:
  84. $front->setParam('noViewRenderer', true);
  85. ]]></programlisting>
  86. </note>
  87. </sect2>
  88. <sect2 id="zend.controller.front.methods.primary">
  89. <title>Métodos Básicos</title>
  90. <para>El front controller tiene varios accessors para establecer su medio ambiente. Sin
  91. embargo, hay tres métodos básicos clave para la funcionalidad del front controller:</para>
  92. <sect3 id="zend.controller.front.methods.primary.getinstance">
  93. <title>getInstance()</title>
  94. <para>
  95. <methodname>getInstance()</methodname>
  96. se utiliza para recuperar una instancia del
  97. front controller. Como el front
  98. controller implementa un patrón Singleton, este
  99. también es el único medio posible
  100. para instanciar un objeto front controller.
  101. </para>
  102. <programlisting language="php"><![CDATA[
  103. $front = Zend_Controller_Front::getInstance();
  104. ]]></programlisting>
  105. </sect3>
  106. <sect3 id="zend.controller.front.methods.primary.setcontrollerdirectory">
  107. <title>setControllerDirectory() y addControllerDirectory</title>
  108. <para>
  109. <methodname>setControllerDirectory()</methodname>
  110. se usa para decirle a
  111. <link linkend="zend.controller.dispatcher">el dispatcher</link>
  112. dónde buscar para los
  113. archivos de clase
  114. <link linkend="zend.controller.action">action controller</link>
  115. .
  116. Acepta bien un único path o un array asociativo de pares módulo/path.
  117. </para>
  118. <para>Como algunos ejemplos:</para>
  119. <programlisting language="php"><![CDATA[
  120. // Establer el directorio de controladores por defecto:
  121. $front->setControllerDirectory('../application/controllers');
  122. // Establecer varios directorios módulos a la vez:
  123. $front->setControllerDirectory(array(
  124. 'default' => '../application/controllers',
  125. 'blog' => '../modules/blog/controllers',
  126. 'news' => '../modules/news/controllers',
  127. ));
  128. // Agregar un directorio de módulos 'foo':
  129. $front->addControllerDirectory('../modules/foo/controllers', 'foo');
  130. ]]></programlisting>
  131. <note>
  132. <para>
  133. Si usa
  134. <methodname>addControllerDirectory()</methodname>
  135. sin un nombre de
  136. módulo, este establecerá el directorio
  137. <emphasis>default</emphasis>
  138. para el
  139. módulo -- sobreescribiéndolo si ya existe.
  140. </para>
  141. </note>
  142. <para>
  143. Puede conseguir la configuración actual para el directorio del controlador
  144. utilizando
  145. <methodname>getControllerDirectory()</methodname>
  146. ; este devolverá un
  147. array de pares módulo y directorio.
  148. </para>
  149. </sect3>
  150. <sect3 id="zend.controller.front.methods.primary.addmoduledirectory">
  151. <title>addModuleDirectory() y getModuleDirectory()</title>
  152. <para>
  153. Uno de los aspectos del front controller es que puede
  154. <link linkend="zend.controller.modular"> definir una estructura modular de
  155. directorio</link>
  156. para crear componentes standalone; estos son llamados
  157. "módulos".
  158. </para>
  159. <para>
  160. Cada módulo debe estar en su propio directorio y ser un espejo de la estructura
  161. del
  162. directorio del módulo por defecto -- es decir, que debería tener como mínimo un
  163. subdirectorio de
  164. <filename>/controllers/</filename>
  165. , y típicamente un subdirectorio
  166. de
  167. <filename>/views/</filename>
  168. y otros subdirectorios de aplicaciones.
  169. </para>
  170. <para>
  171. <methodname>addModuleDirectory()</methodname>
  172. permite pasar el nombre de un
  173. directorio que contiene uno o más directorios de
  174. módulos. A continuación lo analiza
  175. y los añade como directorios de controladores al
  176. front controller.
  177. </para>
  178. <para>
  179. Después, si quiere determinar el path a un determinado módulo o al módulo actual,
  180. puede llamar a
  181. <methodname>getModuleDirectory()</methodname>
  182. , opcionalmente puede
  183. pasar un nombre de módulo para conseguir el directorio de ese
  184. módulo específico.
  185. </para>
  186. </sect3>
  187. <sect3 id="zend.controller.front.methods.primary.dispatch">
  188. <title>dispatch()</title>
  189. <para>
  190. <methodname>dispatch(Zend_Controller_Request_Abstract $request = null,
  191. Zend_Controller_Response_Abstract $response = null)</methodname>
  192. hace el trabajo
  193. pesado del front controller. Puede opcionalmente tomar un
  194. <link linkend="zend.controller.request">request object</link>
  195. y/o un
  196. <link linkend="zend.controller.response">response object</link>
  197. , permitiendo al
  198. desarrollador pasar objetos peronalizados para cada uno.
  199. </para>
  200. <para>
  201. Si no se pasa ningun objeto solicitud o respuesta,
  202. <methodname>dispatch()</methodname>
  203. comprobará por objetos previamente
  204. registrados y utilizará esos o instanciará
  205. versiones por defecto a utilizar en su
  206. proceso (en ambos casos, el sabor de
  207. <acronym>HTTP</acronym>
  208. será utilizado por
  209. defecto).
  210. </para>
  211. <para>
  212. Similarmente,
  213. <methodname>dispatch()</methodname>
  214. comprueba los objetos
  215. registrados
  216. <link linkend="zend.controller.router">router</link>
  217. y
  218. <link linkend="zend.controller.dispatcher">dispatcher</link>
  219. , instanciando las
  220. versiones por defecto de cada uno si ninguno de ellos se
  221. encuentra.
  222. </para>
  223. <para>El proceso de dispatch tiene tres eventos distintos:</para>
  224. <itemizedlist>
  225. <listitem>
  226. <para>Routing</para>
  227. </listitem>
  228. <listitem>
  229. <para>Dispatching</para>
  230. </listitem>
  231. <listitem>
  232. <para>Response</para>
  233. </listitem>
  234. </itemizedlist>
  235. <para>
  236. El routing se lleva a cabo exactamente una vez, utilizando los valores del objeto
  237. solicitud cuando se llama a
  238. <methodname>dispatch()</methodname>
  239. . El dispatching se
  240. lleva a cabo en un bucle; una solicitud puede indicar, bien
  241. múltiples acciones de
  242. dispatch, o el controlador o un plugin pueden restablecer el
  243. objeto solicitud para
  244. forzar medidas adicionales para dispatch. Cuando todo está
  245. hecho, el front
  246. controller devuelve una respuesta.
  247. </para>
  248. </sect3>
  249. <sect3 id="zend.controller.front.methods.primary.run">
  250. <title>run()</title>
  251. <para>
  252. <methodname>Zend_Controller_Front::run($path)</methodname>
  253. es un método estático que
  254. toma simplemente un path a un directorio que contiene
  255. controladores. Obtiene una
  256. instancia del front controller (via
  257. <link linkend="zend.controller.front.methods.primary.getinstance">getInstance()</link>
  258. , registra el path provisto via
  259. <link linkend="zend.controller.front.methods.primary.setcontrollerdirectory">setControllerDirectory()</link>
  260. , y finalmente
  261. <link linkend="zend.controller.front.methods.primary.dispatch">dispatches</link>
  262. .
  263. </para>
  264. <para>
  265. Básicamente,
  266. <methodname>run()</methodname>
  267. es un método conveniente que pueden
  268. utilizarse para setups de sitios que no requieran
  269. la personalización del medio
  270. ambiente del front controller.
  271. </para>
  272. <programlisting language="php"><![CDATA[
  273. // Instanciar el front controller, establecer el directorio de controladores,
  274. // y hacer el dispatch fácilmente en en un solo paso:
  275. Zend_Controller_Front::run('../application/controllers');
  276. ]]></programlisting>
  277. </sect3>
  278. </sect2>
  279. <sect2 id="zend.controller.front.methods.environment">
  280. <title>Métodos Accessor Ambientales</title>
  281. <para>Además de los métodos enumerados anteriormente, hay una serie de métodos accessor que
  282. pueden utilizarse para afectar el entorno del front controller -- y por lo tanto el
  283. ambiente de las clases a las cuales delega el front controller.</para>
  284. <itemizedlist>
  285. <listitem>
  286. <para>
  287. <methodname>resetInstance()</methodname>
  288. puede ser utilizada para borrar todos
  289. los settings actuales. Su objetivo
  290. principal es para testing, pero también puede
  291. ser utilizada para instancias donde
  292. desee encadenar múltiples front controllers.
  293. </para>
  294. </listitem>
  295. <listitem>
  296. <para>
  297. <methodname>(set|get)DefaultControllerName()</methodname>
  298. permite especificar un
  299. nombre diferente para usar en el controlador por defecto
  300. (en caso coontrario, se
  301. usa 'index') y recuperar el valor actual. Delegan a
  302. <link linkend="zend.controller.dispatcher">el dispatcher</link>
  303. .
  304. </para>
  305. </listitem>
  306. <listitem>
  307. <para>
  308. <methodname>setDefaultAction()</methodname>
  309. y
  310. <methodname>getDefaultAction()</methodname>
  311. le deja especificar un nombre
  312. diferente a utilizar para la acción predeterminada
  313. (en caso coontrario, se usa
  314. 'index') y recuperar el valor actual. Delegan a
  315. <link linkend="zend.controller.dispatcher">el dispatcher</link>
  316. .
  317. </para>
  318. </listitem>
  319. <listitem>
  320. <para>
  321. <methodname>setRequest()</methodname>
  322. y
  323. <methodname>getRequest()</methodname>
  324. le
  325. permite especificar la clase u objeto
  326. <link linkend="zend.controller.request">el
  327. request</link>
  328. a usar durante el proceso de dispatch y recuperar el objeto
  329. actual. Al setear el
  330. objeto solicitud, puede pasarlo en un nombre de clase de
  331. solicitud, en cuyo caso
  332. el método va a cargar el archivo clase y lo instanciará.
  333. </para>
  334. </listitem>
  335. <listitem>
  336. <para>
  337. <methodname>setRouter()</methodname>
  338. <methodname>getRouter()</methodname>
  339. le permite especificar la clase u objeto
  340. <link linkend="zend.controller.router">el router</link>
  341. a usar durante el
  342. proceso de dispatch y recuperar el objeto actual. Al setear el
  343. objeto router,
  344. puede pasarlo en un nombre de clase de router, en cuyo caso el
  345. método va a
  346. cargar el archivo clase y lo instanciará.
  347. </para>
  348. <para>Al recuperar el objeto router, en primer lugar comprueba para ver si hay
  349. alguno presente, y si no, instancia al router por defecto(reescribe el router).
  350. </para>
  351. </listitem>
  352. <listitem>
  353. <para>
  354. <methodname>setBaseUrl()</methodname>
  355. y
  356. <methodname>getBaseUrl()</methodname>
  357. le
  358. permite especificar
  359. <link linkend="zend.controller.request.http.baseurl">la URL
  360. base</link>
  361. de la cual tirar cuando se rutean peticiones y recuperar el
  362. valor actual. El
  363. valor se provee al objeto solicitud justo antes de rutear.
  364. </para>
  365. </listitem>
  366. <listitem>
  367. <para>
  368. <methodname>setDispatcher()</methodname>
  369. y
  370. <methodname>getDispatcher()</methodname>
  371. le permite especificar la clase u
  372. objeto
  373. <link linkend="zend.controller.dispatcher">el dispatcher</link>
  374. a usar
  375. durante el proceso de dispatch y recuperar el objeto actual. Al setear el
  376. objeto
  377. dispatch, puede pasarlo en un nombre de clase de dispatcher, en cuyo caso
  378. el
  379. método va a cargar el archivo clase y lo instanciará.
  380. </para>
  381. <para>Al recuperar el objeto dispatch, en primer lugar comprueba para ver si hay
  382. alguno presente, y si no, instancia al dispatcher por defecto.</para>
  383. </listitem>
  384. <listitem>
  385. <para>
  386. <methodname>setResponse()</methodname>
  387. y
  388. <methodname>getResponse()</methodname>
  389. le permite especificar la clase u objeto
  390. <link linkend="zend.controller.response">response</link>
  391. a usar durante el proceso
  392. de dispatch y recuperar el objeto actual. Al setear el
  393. objeto response, puede
  394. pasarlo en un nombre de clase de response, en cuyo caso el
  395. método va a cargar el
  396. archivo clase y lo instanciará.
  397. </para>
  398. </listitem>
  399. <listitem>
  400. <para>
  401. <methodname>registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex
  402. = null)</methodname>
  403. le permite registrar
  404. <link linkend="zend.controller.plugins">plugin objects</link>
  405. . Opcionalmente,
  406. setting
  407. <varname>$stackIndex</varname>
  408. , puede controlar el orden en que se
  409. ejecutarán los plugins.
  410. </para>
  411. </listitem>
  412. <listitem>
  413. <para>
  414. <methodname>unregisterPlugin($plugin)</methodname>
  415. le permite desregistrar
  416. <link linkend="zend.controller.plugins">plugin objects</link>
  417. .
  418. <varname>$plugin</varname>
  419. puede ser tanto un objeto plugin o un string que
  420. denota la clase de plugin a
  421. desregistrar.
  422. </para>
  423. </listitem>
  424. <listitem>
  425. <para>
  426. <methodname>throwExceptions($flag)</methodname>
  427. se utiliza para activar o
  428. desactivar la capacidad de arrojar excepciones durante
  429. el proceso de dispatch.
  430. Por defecto, las excepciones son capturadas y colocadas
  431. en el
  432. <link linkend="zend.controller.response">objeto response </link>
  433. ; activando
  434. <methodname>throwExceptions()</methodname>
  435. se anulará este comportamiento.
  436. </para>
  437. <para>
  438. Para más información, lea
  439. <xref linkend="zend.controller.exceptions"/>
  440. .
  441. </para>
  442. </listitem>
  443. <listitem>
  444. <para>
  445. <methodname>returnResponse($flag)</methodname>
  446. se usa para decirle al front
  447. controller cuando regresar la respuesta (
  448. <constant>TRUE</constant>
  449. ) desde
  450. <methodname>dispatch()</methodname>
  451. , o si la respuesta debe ser emitida
  452. automáticamente (
  453. <constant>FALSE</constant>
  454. ). Por defecto, la respuesta es
  455. automáticamente emitida (llamando a
  456. <methodname>Zend_Controller_Response_Abstract::sendResponse()</methodname>
  457. );
  458. activando
  459. <methodname>returnResponse()</methodname>
  460. ) se anulará este
  461. comportamiento.
  462. </para>
  463. <para>Las razones para regresar la respuesta incluyen un deseo de comprobar las
  464. excepciones antes de emitir la respuesta, necesidad de hacer un log de diversos
  465. aspectos de la respuesta (tales como cabeceras), etc.</para>
  466. </listitem>
  467. </itemizedlist>
  468. </sect2>
  469. <sect2 id="zend.controller.front.methods.params">
  470. <title>Parámetros de Front Controller</title>
  471. <para>En la introducción, se indicó que el front controller también actúa como un registro
  472. de los distintos componentes del controlador. Lo hace mediante una familia de métodos
  473. "param". Estos métodos le permiten registrar datos arbitrarios -- objetos y variables --
  474. con el front controller, a ser devueltos en cualquier momento en la cadena de dispatch.
  475. Estos valores se transmiten al router, al dispatcher, y a los action controllers. Los
  476. métodos incluyen:</para>
  477. <itemizedlist>
  478. <listitem>
  479. <para>
  480. <methodname>setParam($name, $value)</methodname>
  481. permite establecer un único
  482. parámetro de
  483. <varname>$name</varname>
  484. con el valor
  485. <varname>$value</varname>
  486. .
  487. </para>
  488. </listitem>
  489. <listitem>
  490. <para>
  491. <methodname>setParams(array $params)</methodname>
  492. permite configurar varios
  493. parámetros a la vez usando un array asociativo.
  494. </para>
  495. </listitem>
  496. <listitem>
  497. <para>
  498. <methodname>getParam($name)</methodname>
  499. permite recuperar un único parámetro a
  500. la vez, utilizando como identificador a
  501. <varname>$name</varname>
  502. .
  503. </para>
  504. </listitem>
  505. <listitem>
  506. <para>
  507. <methodname>getParams()</methodname>
  508. permite recuperar toda la lista de
  509. parámetros a la vez.
  510. </para>
  511. </listitem>
  512. <listitem>
  513. <para>
  514. <methodname>clearParams()</methodname>
  515. permite borrar un único parámetro
  516. (pasando un string identificador), parámetros
  517. con múltiples nombres (pasando un
  518. array de strings identificadores), o el stack
  519. de parámetros completo (pasando
  520. nada).
  521. </para>
  522. </listitem>
  523. </itemizedlist>
  524. <para>Hay varios parámetros pre-definidos que puede ser seteados para tener usos
  525. específicos
  526. en la cadena de dispatch:</para>
  527. <itemizedlist>
  528. <listitem>
  529. <para>
  530. <methodname>useDefaultControllerAlways</methodname>
  531. se usa para indicar a
  532. <link linkend="zend.controller.dispatcher">el dispatcher</link>
  533. que utilice el
  534. controlador por defecto en el módulo por defecto de cualquier
  535. solicitud que no
  536. sea dispatchable (es decir, el módulo, el controlador y/o la
  537. acción no existen).
  538. Por defecto, está en off.
  539. </para>
  540. <para>
  541. Ver
  542. <link linkend="zend.controller.exceptions.internal">MVC Exceptions You
  543. May Encounter</link>
  544. para información más detallada sobre el uso de este
  545. setting.
  546. </para>
  547. </listitem>
  548. <listitem>
  549. <para>
  550. <methodname>disableOutputBuffering</methodname>
  551. se usa para indicarle a
  552. <link linkend="zend.controller.dispatcher">el dispatcher</link>
  553. que no debe
  554. utilizar output buffering para capturar la salida generada por los
  555. controladores
  556. de acción. Por defecto, el dispatcher captura cualquier salida y la
  557. añade al
  558. contenido del cuerpo del objeto respuesta.
  559. </para>
  560. </listitem>
  561. <listitem>
  562. <para>
  563. <emphasis>noViewRenderer</emphasis>
  564. se usa para deshabilitar el
  565. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  566. .
  567. Poniendo este parámetro a true, lo deshabilita.
  568. </para>
  569. </listitem>
  570. <listitem>
  571. <para>
  572. <emphasis>noErrorHandler</emphasis>
  573. se usa para deshabilitar el
  574. <link linkend="zend.controller.plugins.standard.errorhandler">Error Handler
  575. plugin</link>
  576. . Poniendo este parámetro a true, lo deshabilita.
  577. </para>
  578. </listitem>
  579. </itemizedlist>
  580. </sect2>
  581. <sect2 id="zend.controller.front.subclassing">
  582. <title>Extendiendo el Front Controller</title>
  583. <para>
  584. Para extender el Front Controller, como mínimo que necesitará anular el método
  585. <methodname>getInstance()</methodname>
  586. :
  587. </para>
  588. <programlisting language="php"><![CDATA[
  589. class My_Controller_Front extends Zend_Controller_Front
  590. {
  591. public static function getInstance()
  592. {
  593. if (null === self::$_instance) {
  594. self::$_instance = new self();
  595. }
  596. return self::$_instance;
  597. }
  598. }
  599. ]]></programlisting>
  600. <para>
  601. Anulando el método
  602. <methodname>getInstance()</methodname>
  603. asegura que las
  604. subsiguientes llamadas a
  605. <methodname>Zend_Controller_Front::getInstance()</methodname>
  606. devolverá una instancia de su nueva subclase en lugar de una instancia
  607. <classname>Zend_Controller_Front</classname>
  608. -- esto es particularmente útil para
  609. algunos de los routers alternativos y view helpers.
  610. </para>
  611. <para>Típicamente, no necesitará una subclase del front controller a menos que necesite
  612. añadir nuevas funcionalidades (por ejemplo, un plugin autoloader, o una forma de
  613. especificar los paths de los action helpers). Algunos de los puntos donde puede querer
  614. modificar el comportamiento puede incluir modificar cómo son almacenados los directorios
  615. de controladores , o qué router predeterminado o dispatcher se utiliza.</para>
  616. </sect2>
  617. </sect1>