Zend_Controller-FrontController.xml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. <sect1 id="zend.controller.front">
  2. <title>O Front Controller</title>
  3. <sect2 id="zend.controller.front.overview">
  4. <title>Resumo</title>
  5. <para>
  6. <code>Zend_Controller_Front</code> implementa um <ulink
  7. url="http://www.martinfowler.com/eaaCatalog/frontController.html">padrão Front
  8. Controller</ulink> usado nas aplicações <ulink
  9. url="http://pt-br.wikipedia.org/wiki/Model-view-controller">Model-View-Controller
  10. (MVC)</ulink>. Seu objetivo é inicializar o ambiente de requisição,
  11. roterizar as requisições que chegam, e despachalas para quaquel ações
  12. descobertas; ele agrega alguma resposta e devolve-os quando o
  13. processo é completo.
  14. </para>
  15. <para>
  16. <code>Zend_Controller_Front</code> também implementa o <ulink
  17. url="http://pt-br.wikipedia.org/wiki/Singleton_pattern">padrão Singleton
  18. </ulink>, signicando que somente uma instancia dele pode estar disponivel
  19. em qualquer tempo. Isto permite que ele atue também como um registro em
  20. que outros objetos no processo de despacho possam usar.
  21. </para>
  22. <para>
  23. <code>Zend_Controller_Front</code> registra uma <link
  24. linkend="zend.controller.plugins">plugin de entrada</link> que
  25. por si só, permite que vários eventos sejam disparados para
  26. outros plugins observadores. Em muitos casos, isto permite ao
  27. desenvolvedor a oportunidade para mudar o processo de despacho do
  28. site sem a necessidade de extender o controlador de frente para
  29. adicionar funcionalidade.
  30. </para>
  31. <para>
  32. O mínimo necessário, que o controlador de frente necessita é um ou mais
  33. caminho para os diretórios contendo os
  34. <link linkend="zend.controller.action">controles de ação</link>
  35. para poder fazer seu trabalho. Vários metódos também
  36. podem ser invocados para mudar o ambiente do controlador de frente
  37. e suas classe auxiliares.
  38. </para>
  39. <note>
  40. <title>Comportamento padrão</title>
  41. <para>
  42. Por padrão, o controlador de frente carrega o <link
  43. linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
  44. plugin, bem como o <link
  45. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  46. plugin de ação auxiliar. Faz isto para simplificar o controle de erro e
  47. a apresentação de visulizadores em seus controles, repectivamente.
  48. </para>
  49. <para>
  50. Para desabilitar o <code>ErrorHandler</code>, execute a seguinte
  51. chamada em qualquer ponto antes de chamar <code>dispatch()</code>:
  52. </para>
  53. <programlisting role="php"><![CDATA[<?php
  54. // Disable the ErrorHandler plugin:
  55. $front->setParam('noErrorHandler', true);]]>
  56. </programlisting>
  57. <para>
  58. Para desabilitar o <code>ViewRenderer</code>, faça o seguinte
  59. antes de chamar <code>dispatch()</code>:
  60. </para>
  61. <programlisting role="php"><![CDATA[<?php
  62. // Disable the ViewRenderer helper:
  63. $front->setParam('noViewRenderer', true);]]>
  64. </programlisting>
  65. </note>
  66. </sect2>
  67. <sect2 id="zend.controller.front.methods.primary">
  68. <title>Metódos Primários</title>
  69. <para>
  70. O controlador de frente possuí vários acessores para configurar
  71. seu ambiente. Entretanto existem três metódos chaves primários
  72. da funcionalidades do controlador de frente:
  73. </para>
  74. <sect3 id="zend.controller.front.methods.primary.getinstance">
  75. <title>getInstance()</title>
  76. <para>
  77. <code>getInstance()</code> é usado para retirar a instancia
  78. do controlador de frente. Como o controlador de frente
  79. implementa o padrão Singleton, isto também é a unica
  80. maneira possível de instanciar um objeto controlador de frente.
  81. </para>
  82. <programlisting role="php"><![CDATA[<?php
  83. $front = Zend_Controller_Front::getInstance();]]>
  84. </programlisting>
  85. </sect3>
  86. <sect3 id="zend.controller.front.methods.primary.setcontrollerdirectory">
  87. <title>setControllerDirectory() and addControllerDirectory</title>
  88. <para>
  89. <code>setControllerDirectory()</code> é usado para dizer <link
  90. linkend="zend.controller.dispatcher">ao despachador</link>
  91. onde procurar os arquivos da classes dos <link
  92. linkend="zend.controller.action">controladores de ação</link>.
  93. Ele aceita tanto um caminho único ou um array associativo
  94. com pares módulo/caminho.
  95. </para>
  96. <para>
  97. Alguns exemplos:
  98. </para>
  99. <programlisting role="php"><![CDATA[
  100. // Set the default controller directory:
  101. $front->setControllerDirectory('../application/controllers');
  102. // Set several module directories at once:
  103. $front->setControllerDirectory(array(
  104. 'default' => '../application/controllers',
  105. 'blog' => '../modules/blog/controllers',
  106. 'news' => '../modules/news/controllers',
  107. ));
  108. // Add a 'foo' module directory:
  109. $front->addControllerDirectory('../modules/foo/controllers', 'foo');]]>
  110. </programlisting>
  111. <note>
  112. <para>
  113. Se você usar <code>addControllerDirectory()</code> sem um
  114. nome de módulo, ele irá configurar o diretório para o módulo
  115. <code>padrão</code> -- sobrescrevendo-o se ele já existir.
  116. </para>
  117. </note>
  118. <para>
  119. Você pode pegar a configuração corrente do diretório do
  120. controlador usando <code>getControllerDirectory()</code>;
  121. isto irá retornar um array de pares módulo/diretório.
  122. </para>
  123. </sect3>
  124. <sect3 id="zend.controller.front.methods.primary.dispatch">
  125. <title>dispatch()</title>
  126. <para>
  127. <code>dispatch(Zend_Controller_Request_Abstract $request = null,
  128. Zend_Controller_Response_Abstract $response = null)</code>
  129. faz o trabalho pesado do controlador de frente. Ele pode
  130. opcionalmente pegar um <link linkend="zend.controller.request">objeto
  131. de requisição</link> e/ou um <link
  132. linkend="zend.controller.response">objeto de resposta</link>,
  133. permitindo ao desenvolvedor passar a ele objetos personalizados
  134. de cada.
  135. </para>
  136. <para>
  137. Se nenhum objeto de requisição ou resposta for passado,
  138. <code>dispatch()</code> irá procurar por objetos previamente
  139. registrados e usa-los ou instanciar versões padrão para usar
  140. em seus processos (em ambos os casos, o HTTP será usado como padrão).
  141. </para>
  142. <para>
  143. Similarmente, <code>dispatch()</code> checa por uma
  144. <link linkend="zend.controller.router">router</link> registrada e
  145. um objetos de
  146. <link linkend="zend.controller.dispatcher">dispacho</link>,
  147. instanceando a versão padrão de cada um deles se não encontrar
  148. nenhum.
  149. </para>
  150. <para>
  151. O processo de dispacho possui três eventos distintos:
  152. </para>
  153. <itemizedlist>
  154. <listitem><para>Roterização</para></listitem>
  155. <listitem><para>Despacho</para></listitem>
  156. <listitem><para>Resposta</para></listitem>
  157. </itemizedlist>
  158. <para>
  159. A Roterização realiza-se exatamente uma vez, usando os valores
  160. no objeto de requisicão quando <code>dispatch()</code> é chamado.
  161. O Despacho ocorre em um laço; uma requisição pode tanto indicar
  162. multiplas ações para dispachar, ou o controlador ou um plugin pode
  163. reiniciar o objeto de requisição para forçar ações adicionais
  164. para o despacho. Quando tudo está pronto, o controlador de frente
  165. retorna uma resposta.
  166. </para>
  167. </sect3>
  168. <sect3 id="zend.controller.front.methods.primary.run">
  169. <title>run()</title>
  170. <para>
  171. <code>Zend_Controller_Front::run($path)</code> é um método estático
  172. que toma simplesmente um caminho para um diretório contendo
  173. os controladores. Ele
  174. <code>Zend_Controller_Front::run($path)</code> is a static
  175. method taking simply a path to a directory containing
  176. controllers. Ele traz um exemplo de controlador de frente (via
  177. <link
  178. linkend="zend.controller.front.methods.primary.getinstance">getInstance()</link>,
  179. registra o caminho fornecido via <link
  180. linkend="zend.controller.front.methods.primary.setcontrollerdirectory">setControllerDirectory()</link>,
  181. e finalmente <link
  182. linkend="zend.controller.front.methods.primary.dispatch">dispacha</link>.
  183. </para>
  184. <para>
  185. Basicamente, <code>run()</code> é um método de conveniência que pode
  186. ser usado para configurações de sítios que não necessitam de customizações
  187. no ambiente de controle de frente.
  188. </para>
  189. <programlisting role="php"><![CDATA[<?php
  190. // Instantiate front controller, set controller directory, and dispatch in one
  191. // easy step:
  192. Zend_Controller_Front::run('../application/controllers');]]>
  193. </programlisting>
  194. </sect3>
  195. </sect2>
  196. <sect2 id="zend.controller.front.methods.environment">
  197. <title>Métodos Acessores Ambientais</title>
  198. <para>
  199. Além dos métodos enumerados em cima, há um número de
  200. os métodos acessores que podem ser usados para afetar o ambiente
  201. do controlador de frente - e assim o ambiente das classes em que
  202. o controlador de frente delega.
  203. </para>
  204. <itemizedlist>
  205. <listitem>
  206. <para>
  207. <code>resetInstance()</code> pode ser usado para limpar
  208. todas as configurações atualmente definidas.
  209. Seu propósito inicial é para teste, mas
  210. ele também pode ser usado para intâncias onde você
  211. deseja encadear um conjunto de múltiplos controladores de
  212. frente.
  213. </para>
  214. </listitem>
  215. <listitem>
  216. <para>
  217. <code>(set|get)DefaultControllerName()</code> permite a você
  218. específicar um nome difetente para usar no controlador padrão
  219. ('index' é usado de outra maneira) e recuperar o valor atual.
  220. Eles apontaram para o <link
  221. linkend="zend.controller.dispatcher">o despachante</link>.
  222. </para>
  223. </listitem>
  224. <listitem>
  225. <para>
  226. <code>(set|get)DefaultActionName()</code> permite a você epecíficar
  227. um nome diferente para ser usado na ação padrão ('index' é usado
  228. por padrão) e recuperar o valor atual. Eles apontãm para
  229. <link linkend="zend.controller.dispatcher"> o
  230. despachante</link>.
  231. </para>
  232. </listitem>
  233. <listitem>
  234. <para>
  235. <code>(set|get)Request()</code> permite a você específicar
  236. a classe <link
  237. linkend="zend.controller.request">de pedido</link>
  238. ou objeto para usar durente o processo de despacho e
  239. para recuperar o objeto atual. Ao configurar o objeto de
  240. requisição, você pode passar uma nome de classe de requisição,
  241. neste caso o metódo irá carregar o arquivo da classe e instancia-la.
  242. </para>
  243. </listitem>
  244. <listitem>
  245. <para>
  246. <code>(set|get)Router()</code> permite a você especificar o objeto ou classe <link
  247. linkend="zend.controller.router">roteador(a)</link>
  248. para usar durante o processo de dispacho e para
  249. recuperar o objeto atual. Quando estiver definindo o objeto
  250. roteador, você pode passar o nome de uma classe roteadora
  251. e neste caso o metódo roteado irá carregar o arquivo da classe
  252. e instancia-la.
  253. </para>
  254. <para>
  255. Quando recuperá o objeto roteador, ele primeiro verifica se já
  256. existe um, se não, instanceia o reteador padrão (roteador re-escrito).
  257. </para>
  258. </listitem>
  259. <listitem>
  260. <para>
  261. <code>(set|get)BaseUrl()</code> let you specify <link
  262. linkend="zend.controller.request.http.baseurl">the base
  263. URL</link> to strip when routing requests and to
  264. retrieve the current value. The value is provided to the
  265. request object just prior to routing.
  266. </para>
  267. </listitem>
  268. <listitem>
  269. <para>
  270. <code>(set|get)Dispatcher()</code> let you specify <link
  271. linkend="zend.controller.dispatcher">the
  272. dispatcher</link> class or object to use during the
  273. dispatch process and retrieve the current object. When
  274. setting the dispatcher object, you may pass in a dispatcher
  275. class name, in which case the method will load the class
  276. file and instantiate it.
  277. </para>
  278. <para>
  279. When retrieving the dispatcher object, it first checks to see if
  280. one is present, and if not, instantiates the default
  281. dispatcher.
  282. </para>
  283. </listitem>
  284. <listitem>
  285. <para>
  286. <code>(set|get)Response()</code> let you specify <link
  287. linkend="zend.controller.response">the response</link>
  288. class or object to use during the dispatch process and to
  289. retrieve the current object. When setting the response
  290. object, you may pass in a response class name, in which case
  291. the method will load the class file and instantiate it.
  292. </para>
  293. </listitem>
  294. <listitem>
  295. <para>
  296. <code>registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null)</code>
  297. allows you to register a <link
  298. linkend="zend.controller.plugins">plugin objects</link>.
  299. By setting the optional <code>$stackIndex</code>, you can
  300. control the order in which plugins will execute.
  301. </para>
  302. </listitem>
  303. <listitem>
  304. <para>
  305. <code>unregisterPlugin($plugin)</code> let you
  306. unregister <link
  307. linkend="zend.controller.plugins">plugin objects</link>.
  308. <code>$plugin</code> may be either a plugin object or a
  309. string denoting the class of plugin to unregister.
  310. </para>
  311. </listitem>
  312. <listitem>
  313. <para>
  314. <code>throwExceptions($flag)</code> is used to turn on/off
  315. the ability to throw exceptions during the dispatch process.
  316. By default, exceptions are caught and placed in the <link
  317. linkend="zend.controller.response">response
  318. object</link>; turning on <code>throwExceptions()</code>
  319. will override this behaviour.
  320. </para>
  321. <para>
  322. For more information, read <xref
  323. linkend="zend.controller.exceptions" />.
  324. </para>
  325. </listitem>
  326. <listitem>
  327. <para>
  328. <code>returnResponse($flag)</code> is used to tell the front
  329. controller whether to return the response
  330. (<code>true</code>) from <code>dispatch()</code>, or if the
  331. response should be automatically emitted
  332. (<code>false</code>). By default, the response is
  333. automatically emitted (by calling
  334. <code>Zend_Controller_Response_Abstract::sendResponse()</code>);
  335. turning on <code>returnResponse()</code> will override this
  336. behaviour.
  337. </para>
  338. <para>
  339. Reasons to return the response include a desire to check for
  340. exceptions prior to emitting the response, needing to log
  341. various aspects of the response (such as headers), etc.
  342. </para>
  343. </listitem>
  344. </itemizedlist>
  345. </sect2>
  346. <sect2 id="zend.controller.front.methods.params">
  347. <title>Front Controller Parameters</title>
  348. <para>
  349. In the introduction, we indicated that the front controller also
  350. acts as a registry for the various controller components. It does so
  351. through a family of "param" methods. These methods allow you to
  352. register arbitrary data -- objects and variables -- with the front
  353. controller to be retrieved at any time in the dispatch chain. These
  354. values are passed on to the router, dispatcher, and action
  355. controllers. The methods include:
  356. </para>
  357. <itemizedlist>
  358. <listitem>
  359. <para>
  360. <code>setParam($name, $value)</code> allows you to set a
  361. single parameter of <code>$name</code> with value
  362. <code>$value</code>.
  363. </para>
  364. </listitem>
  365. <listitem>
  366. <para>
  367. <code>setParams(array $params)</code> allows you to set
  368. multiple parameters at once using an associative array.
  369. </para>
  370. </listitem>
  371. <listitem>
  372. <para>
  373. <code>getParam($name)</code> allows you to retrieve a single
  374. parameter at a time, using <code>$name</code> as the
  375. identifier.
  376. </para>
  377. </listitem>
  378. <listitem>
  379. <para>
  380. <code>getParams()</code> allows you to retrieve the entire
  381. list of parameters at once.
  382. </para>
  383. </listitem>
  384. <listitem>
  385. <para>
  386. <code>clearParams()</code> allows you to clear a single
  387. parameter (by passing a string identifier), multiple named
  388. parameters (by passing an array of string identifiers), or the
  389. entire parameter stack (by passing nothing).
  390. </para>
  391. </listitem>
  392. </itemizedlist>
  393. <para>
  394. There are several pre-defined parameters that may be set that have
  395. specific uses in the dispatch chain:
  396. </para>
  397. <itemizedlist>
  398. <listitem>
  399. <para>
  400. <code>useDefaultControllerAlways</code> is used to hint to
  401. <link linkend="zend.controller.dispatcher">the
  402. dispatcher</link> to use the default controller in the
  403. default module for any request that is not dispatchable
  404. (i.e., the module, controller, and/or action do not exist).
  405. By default, this is off.
  406. </para>
  407. <para>
  408. See <xref linkend="zend.controller.exceptions.internal" />
  409. for more detailed information on using this setting.
  410. </para>
  411. </listitem>
  412. <listitem>
  413. <para>
  414. <code>disableOutputBuffering</code> is used to hint to <link
  415. linkend="zend.controller.dispatcher">the
  416. dispatcher</link> that it should not use output
  417. buffering to capture output generated by action controllers.
  418. By default, the dispatcher captures any output and appends
  419. it to the response object body content.
  420. </para>
  421. </listitem>
  422. <listitem>
  423. <para>
  424. <code>noViewRenderer</code> is used to disable the <link
  425. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  426. Set this parameter to true to disable it.
  427. </para>
  428. </listitem>
  429. <listitem>
  430. <para>
  431. <code>noErrorHandler</code> is used to disable the <link
  432. linkend="zend.controller.plugins.standard.errorhandler">Error
  433. Handler plugin</link>. Set this parameter to true to
  434. disable it.
  435. </para>
  436. </listitem>
  437. </itemizedlist>
  438. </sect2>
  439. <sect2 id="zend.controller.front.subclassing">
  440. <title>Subclassing the Front Controller</title>
  441. <para>
  442. To subclass the Front Controller, at the very minimum you will need
  443. to override the <code>getInstance()</code> method:
  444. </para>
  445. <programlisting role="php"><![CDATA[
  446. class My_Controller_Front extends Zend_Controller_Front
  447. {
  448. public static function getInstance()
  449. {
  450. if (null === self::$_instance) {
  451. self::$_instance = new self();
  452. }
  453. return self::$_instance;
  454. }
  455. }
  456. ]]>
  457. </programlisting>
  458. <para>
  459. Overriding the <code>getInstance()</code> method ensures that
  460. subsequent calls to
  461. <code>Zend_Controller_Front::getInstance()</code> will return an
  462. instance of your new subclass instead of a
  463. <code>Zend_Controller_Front</code> instance -- this is particularly
  464. useful for some of the alternate routers and view helpers.
  465. </para>
  466. <para>
  467. Typically, you will not need to subclass the front controller unless
  468. you need to add new functionality (for instance, a plugin
  469. autoloader, or a way to specify action helper paths). Some points
  470. where you may want to alter behaviour may include modifying how
  471. controller directories are stored, or what default router or
  472. dispatcher are used.
  473. </para>
  474. </sect2>
  475. </sect1>
  476. <!--
  477. vim:se ts=4 sw=4 et:
  478. -->