Zend_Tool-Extending.xml 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24346 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.tool.extending">
  5. <title>Extendendo o Zend_Tool</title>
  6. <sect2 id="zend.tool.extending.overview">
  7. <title>Visão Geral do Zend_Tool</title>
  8. <para>
  9. <classname>Zend_Tool_Framework</classname> é uma framework para expor as funcionalidades
  10. comuns, tais como a criação da estrutura do projeto, geração de código, geração de
  11. índice de pesquisa, e muito mais. Funcionalmente pode ser escrito e exposto por meio de
  12. classes <acronym>PHP</acronym> dentro do <property>include_path</property> do <acronym>PHP</acronym>,
  13. permitindo uma flexibilidade incrível de implementação. A funcionalidade pode ser consumida
  14. escrevendo implementação e/ou clientes de protocolo-específico -- tais como clientes console,
  15. <acronym>XML-RPC</acronym>, <acronym>SOAP</acronym>, e muito mais.
  16. </para>
  17. <para>
  18. <classname>Zend_Tool_Project</classname> desenvolve e amplia os recursos do
  19. <classname>Zend_Tool_Framework</classname> ao de gerenciar um "projeto". Em geral,
  20. um "projeto" é um esforço planejado ou uma iniciativa. No mundo da informática, projetos
  21. em geral são uma coleção de recursos. Esses recursos podem ser arquivos, diretórios,
  22. bases de dados, esquemas, imagens, estilos e muito mais.
  23. </para>
  24. </sect2>
  25. <sect2 id="zend.tool.extending.zend-tool-framework">
  26. <title>Extensões do Zend_Tool_Framework</title>
  27. <sect3 id="zend.tool.extending.zend-tool-framework.architecture">
  28. <title>Arquitetura Geral</title>
  29. <para>
  30. <classname>Zend_Tool_Framework</classname> fornece o seguinte:
  31. </para>
  32. <itemizedlist>
  33. <listitem>
  34. <para>
  35. <emphasis>Interfaces comuns e abstratas</emphasis> que permitem a
  36. desenvolvedores criar funcionalidades e capacidades que são
  37. invocadas por clientes da ferramenta.
  38. </para>
  39. </listitem>
  40. <listitem>
  41. <para>
  42. <emphasis>Funcionalidade base de clientes</emphasis> e uma implementação
  43. concreta do console que conectam ferramentas externas e interfaces para o
  44. Zend_Tool_Framework. O cliente do console pode ser utilizado em ambientes CLI,
  45. como console unix e o console do Windows.
  46. </para>
  47. </listitem>
  48. <listitem>
  49. <para>
  50. <emphasis>Interfaces de "Provider" e "Manifest"</emphasis> que
  51. podem ser usadas pela ferramenta do sistema. "Providers" representam o
  52. aspecto functional do framework, e define as ações que os clientes
  53. da ferramenta podem chamar. "Manifests" age como registros de metadados
  54. que proveem contexto adicional para os vários providers definidos.
  55. </para>
  56. </listitem>
  57. <listitem>
  58. <para>
  59. <emphasis>Um sistema de loading introspectivo</emphasis> que irá
  60. examinar o ambiente a procura de providers e determinar o que é necessário
  61. para chama-los.
  62. </para>
  63. </listitem>
  64. <listitem>
  65. <para>
  66. <emphasis>Uma conjunto padrão de sistemas de providers</emphasis> que
  67. permite o sistema relatar o que todos os recursos do sistemas são, bem como
  68. fornecer um feedback útil. Ele também inclui um compreessível "Systema de Ajuda".
  69. </para>
  70. </listitem>
  71. </itemizedlist>
  72. <para>
  73. Definições que você deve estar ciente de através deste manual com relação
  74. ao <classname>Zend_Tool_Framework</classname> incluem:
  75. </para>
  76. <itemizedlist>
  77. <listitem>
  78. <para>
  79. <classname>Zend_Tool_Framework</classname> - O framework que expõe
  80. recursos da ferramenta.
  81. </para>
  82. </listitem>
  83. <listitem>
  84. <para>
  85. <emphasis>Tooling Client</emphasis> - Uma ferramenta de desenvolvimento que se conecta
  86. ao e consome <classname>Zend_Tool_Framework</classname>.
  87. </para>
  88. </listitem>
  89. <listitem>
  90. <para>
  91. <emphasis>Client</emphasis> - O subsistema do
  92. <classname>Zend_Tool_Framework</classname> que expoe uma interface tal que
  93. tooling clients podem conectar, pesquisar e executar comandos.
  94. </para>
  95. </listitem>
  96. <listitem>
  97. <para>
  98. <emphasis>Console Client / Command Line Interface /
  99. <filename>zf.php</filename></emphasis> - A tooling client para a linha
  100. de comando.</para>
  101. </listitem>
  102. <listitem>
  103. <para>
  104. <emphasis>Provider</emphasis> - Um subsistema e uma coleção de funcionalidades
  105. internas que o framework exporta.
  106. </para>
  107. </listitem>
  108. <listitem>
  109. <para>
  110. <emphasis>Manifest</emphasis> - Um subsistema para definição,
  111. organização, e divulgação de dados exigidos pelo provider.
  112. </para>
  113. </listitem>
  114. <listitem>
  115. <para>
  116. <classname>Zend_Tool_Project</classname> Provider - Um conjunto de providers
  117. especificamente para criação e manutenção de projetos baseados no Zend Framework.
  118. </para>
  119. </listitem>
  120. </itemizedlist>
  121. </sect3>
  122. <sect3 id="zend.tool.extending.zend-tool-framework.cli-client">
  123. <title>Entendendo o Cliente CLI</title>
  124. <para>
  125. A <acronym>CLI</acronym>, ou ferramenta de linha de comando (internamente
  126. conhecida como ferramenta de console), é atualmente a interface primária para enviar
  127. pedidos ao <classname>Zend_Tool</classname> requests. Com a ferramenta <acronym>CLI</acronym>,
  128. desenvolvedores podem enviar pedidos para a ferramenta dentro da "janela de linha de comando", também
  129. comumente conhecida como janela do "terminal". Este ambiente é predominante em
  130. embientes *unix, mas também tem uma implementação comum no Windows como o
  131. <filename>cmd.exe</filename>, console2 e também com o projeto Cygwin.
  132. </para>
  133. <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-general">
  134. <title>Configuração da ferramenta CLI</title>
  135. <para>
  136. Para distribuir pedidos via cliente de linha de comando, primeiro você
  137. precisa configurar o cliente para que seu sistema possa manipular os
  138. comandos "zf". O cliente de linha de comando, para todos as intenções e
  139. propósitos, é o arquivo <filename>.sh</filename> ou <filename>.bat</filename>
  140. que é provido com a sua distribuição do Zend Framework. No trunk, ele pode ser
  141. encontrado aqui:
  142. <ulink
  143. url="http://framework.zend.com/svn/framework/standard/trunk/bin/">http://framework.zend.com/svn/framework/standard/trunk/bin/</ulink>.
  144. </para>
  145. <para>
  146. Como você pode ver, existem 3 arquivos no diretório <filename>/bin/</filename>:
  147. <filename>zf.php</filename>, <filename>zf.sh</filename>, e
  148. <filename>zf.bat</filename>. O <filename>zf.sh</filename> e o <filename>zf.bat</filename>
  149. são os pacotes específicos do sistema operacional: <filename>zf.sh</filename> para ambientes
  150. *nix, e <filename>zf.bat</filename> para ambientes Win32. Estes empacotadores clientes são
  151. responsáveis por procurar o php.exe correto, achando o <filename>zf.php</filename>, e
  152. passando o pedido para o cliente. O <filename>zf.php</filename>, é responsável por
  153. manipular a identificação do seu ambiente, construindo um include_path adequado, e passar o
  154. que é fornecido na linha de comando para o componente de biblioteca adequado
  155. para a expedição.
  156. </para>
  157. <para>
  158. Finalmente, você quer garantir duas coisas para fazer tudo funcionar
  159. independentemente do sistema operacional em que você está:
  160. </para>
  161. <orderedlist>
  162. <listitem>
  163. <para>
  164. <filename>zf.sh/zf.bat</filename> acessível a partir do path do sistema.
  165. Esta é a capacidade de chamar <command>zf</command> de qualquer lugar na sua linha de comando,
  166. independentemente de qual é o seu diretório de trabalho atual.
  167. </para>
  168. </listitem>
  169. <listitem>
  170. <para>
  171. <filename>ZendFramework/library</filename> estar no seu
  172. <property>include_path</property>.
  173. </para>
  174. </listitem>
  175. </orderedlist>
  176. <note>
  177. <para>
  178. Nota: enquanto os acima são os requisitos ideais, você pode simplesmente
  179. baixar o Zend Framework e esperar que ele funcione como <filename>./path/to/zf.php</filename>
  180. algum comando..
  181. </para>
  182. </note>
  183. </sect4>
  184. <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-starnix">
  185. <title>Configurando a ferramenta CLI em Sistemas Unix-like</title>
  186. <para>
  187. A configuração mais comum no ambiente *nix, é copiar o <filename>zf.sh</filename> e
  188. o <filename>zf.php</filename> no mesmo diretório que o seu binário <acronym>PHP</acronym>.
  189. Isto pode geralmente ser achado nos seguintes lugares:
  190. </para>
  191. <programlisting language="text"><![CDATA[
  192. /usr/bin
  193. /usr/local/bin
  194. /usr/local/ZendServer/bin/
  195. /Applications/ZendServer/bin/
  196. ]]></programlisting>
  197. <para>
  198. Para achar a localização do seu binário <acronym>PHP</acronym>, você pode executar
  199. 'which php' na linha de comando. Isto retornará a localização do binário do <acronym>PHP</acronym>
  200. que você está usando para rodar scripts <acronym>PHP</acronym> no seu ambiente.
  201. </para>
  202. <para>
  203. O próximo passo é certificar que a biblioteca Zend Framework está configurada
  204. corretamente dentro do sistema de <property>include_path</property> do
  205. <acronym>PHP</acronym>. Para achar onde seu <property>include_path</property>
  206. está localizado, você pode executar <command>php -i</command> e olhar para
  207. a variável <property>include_path</property>, o mais sucintamente, executar
  208. <command>php -i | grep include_path</command>. Uma vez que você tenha achado
  209. onde seu <property>include_path</property> está localizado (isto irá geralmente
  210. estar em algum lugar como <filename>/usr/lib/php</filename>,
  211. <filename>/usr/share/php</filename>, <filename>/usr/local/lib/php</filename>, ou
  212. similar), certifique que o conteúdos do diretório <filename>/library/</filename>
  213. estão colocados dentro do seu diretório <property>include_path</property>
  214. especificado.
  215. </para>
  216. <para>
  217. Uma vez que você tenha terminado estas duas coisas, você deve ser capaz de digitar
  218. um comando e obter devolta a resposta adequada como:
  219. </para>
  220. <para>
  221. <inlinegraphic scale="100" align="center" valign="middle"
  222. fileref="figures/zend.tool.framework.cliversionunix.png" format="PNG" />
  223. </para>
  224. <para>
  225. Se vocÊ não ver isto digitado na saída, volte e verifique sua configuração
  226. para ter certeza que tem todas as partes necessárias in devido lugar.
  227. </para>
  228. <para>
  229. Existem uma combinação de configurações alternativas que você pode querer empregar
  230. dependendo das configurações dos servidores, seu nível de acesso, ou
  231. por outras razões.
  232. </para>
  233. <para>
  234. <emphasis>Configuração Alternativa</emphasis> envolve guardar o download do
  235. Zend Framework junto como está, e criar um link de um local <constant>PATH</constant>
  236. para o <filename>zf.sh</filename>. O que isto significa é que você coloca o conteúdo
  237. do download do Zend Framework em uma localização tal como <filename>/usr/local/share/ZendFramework</filename>,
  238. ou mais localmente como <filename>/home/username/lib/ZendFramework</filename>, e cria
  239. um link simbólico para o <filename>zf.sh</filename>.
  240. </para>
  241. <para>
  242. Assumindo que você quer colocar o link dentro de <filename>/usr/local/bin</filename>
  243. (isto pode também funcionar colocando o link dentro de <filename>/home/username/bin/</filename>
  244. por exemplo) você poderia dgitar um comando similar a este:
  245. </para>
  246. <programlisting language="sh"><![CDATA[
  247. ln -s /usr/local/share/ZendFramework/bin/zf.sh /usr/local/bin/zf
  248. # OU (por exemplo)
  249. ln -s /home/username/lib/ZendFramework/bin/zf.sh /home/username/bin/zf
  250. ]]></programlisting>
  251. <para>
  252. Isto irá criar um link que você poderá ser capaz de acessar globalmente
  253. na linha de comando.
  254. </para>
  255. </sect4>
  256. <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-windows">
  257. <title>Configurando a ferramenta CLI no Windows</title>
  258. <para>
  259. A confuguração mais comum no ambiente Win32, é copiar o
  260. <filename>zf.bat</filename> e o <filename>zf.php</filename> para dentr do mesmo
  261. diretório do seu binário <acronym>PHP</acronym>. Este pode geralmente ser achado
  262. nos seguintes lugares:
  263. </para>
  264. <programlisting language="text"><![CDATA[
  265. C:\PHP
  266. C:\Program Files\ZendServer\bin\
  267. C:\WAMP\PHP\bin
  268. ]]></programlisting>
  269. <para>
  270. Você deve ser capaz de rodar <filename>php.exe</filename> na linha de comando.
  271. Se você não for capaz, primeiro verifique a documentação que veio com sua
  272. distribuição <acronym>PHP</acronym>, ou tenha certeza que o caminho para o
  273. <filename>php.exe</filename> está na sua variável de ambiente
  274. <constant>PATH</constant> do Windows.
  275. </para>
  276. <para>
  277. O próximo passo é ter certeza que a biblioteca do Zend Framework
  278. está configurada corretamente dentro do sistema de <property>include_path</property>
  279. do <acronym>PHP</acronym>. Para achar onde seu <property>include_path</property>
  280. está localizado, você pode digitar <command>php -i</command> e olhar para a
  281. variável <property>include_path</property>, ou mais sucintamente executar
  282. <command>php -i | grep include_path</command> se você tem um Cygwin configurado
  283. com grep disponível. Uma vez você tenha achado onde seu <property>include_path</property>
  284. está localizado(isto irá geralmente ser algo como <filename>C:\PHP\pear</filename>,
  285. <filename>C:\PHP\share</filename>,<filename>C:\Program%20Files\ZendServer\share</filename>
  286. ou similar), verifique que os conteúdos do diretório library/ estão postos dentro
  287. do seu diretório <property>include_path</property>especificado.
  288. </para>
  289. <para>
  290. Uma vez tenha terminado aquilas duas coisas, você deve ser capaz de enviar um
  291. comando e receber o devida resposta como:
  292. </para>
  293. <para>
  294. <inlinegraphic scale="100" align="center" valign="middle"
  295. fileref="figures/zend.tool.framework.cliversionwin32.png" format="PNG" />
  296. </para>
  297. <para>
  298. Se você não ver isto digitado na saída, volte e verifique sua configuração
  299. para ter certeza que você tem todas as partes necessárias no lugar correto.
  300. </para>
  301. <para>
  302. Existe uma combinação de configurações alternativas que você pode querer empregar
  303. dependendo das configurações do seu servidor, do seu nível de acesso, ou de
  304. outras razões.
  305. </para>
  306. <para>
  307. <emphasis>Configuração Alternativa</emphasis> envolve guardar o download do
  308. Zend Framework junto como está, e alterar ambos seu sistema de <constant>PATH</constant>
  309. bem como o arquivo <filename>php.ini</filename>. No seu ambiente de usuário,
  310. tenha certeza de adcionar <filename>C:\Path\To\ZendFramework\bin</filename>,
  311. então seu arquivo <filename>zf.bat</filename> será executável. Também, altere
  312. o arquivo <filename>php.ini</filename> certificando que
  313. <filename>C:\Path\To\ZendFramework\library</filename> está no seu
  314. <property>include_path</property>.
  315. </para>
  316. </sect4>
  317. <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-othernotes">
  318. <title>Outras Considerações de Configuração</title>
  319. <para>
  320. Se por alguma razão você não quiser a biblioteca do Zend Framework dentro
  321. do seu <property>include_path</property>, existe uma outra opção. Existem
  322. duas variáveis de ambiente especiais que o <filename>zf.php</filename> irá
  323. utilizar para determinar a localização da sua instalação do Zend Framework.
  324. </para>
  325. <para>
  326. A primeira é <constant>ZEND_TOOL_INCLUDE_PATH_PREPEND</constant>, que irá
  327. preceder o valor da variável de ambiente para o sistema de (<filename>php.ini</filename>)
  328. <property>include_path</property> <property>include_path</property> antes
  329. da carga do cliente.
  330. </para>
  331. <para>
  332. Alternativamente, você pode querer usar <constant>ZEND_TOOL_INCLUDE_PATH</constant>
  333. para <emphasis>substituir</emphasis> completamente o sistema de
  334. <property>include_path</property> para um que faça sentido especialmente para
  335. a ferramente de linha de comando <command>zf</command>.
  336. </para>
  337. </sect4>
  338. </sect3>
  339. <sect3 id="zend.tool.extending.zend-tool-framework.providers-and-manifests">
  340. <title>Criando Providers</title>
  341. <para>
  342. Em geral, um provider, por si só, é nada mais que o a casca para um
  343. desenvolvedor para agrupar-se algumas das capacidades que eles desejam
  344. enviar com um o cliente de linha de comando (ou outro). Ele é um análogo
  345. para o que um "controller" é dentro da sua aplicação <acronym>MVC</acronym>.
  346. </para>
  347. <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.loading">
  348. <title>Como o Zend_Tool encontra seus Providers</title>
  349. <para>
  350. Por padrão <classname>Zend_Tool</classname> usa o BasicLoader para encontrar
  351. todos os providers que você pode rodar. Ele itera recursivamente todos
  352. os diretórios do include path e abre todos os arquivos que terminam
  353. com "Manifest.php" ou "Provider.php". Todas as classes naqueles arquivos
  354. são inspecionadas se implementam ou <classname>Zend_Tool_Framework_Provider_Interface</classname>
  355. ou <classname>Zend_Tool_Framework_Manifest_ProviderManifestable</classname>.
  356. Instancias da interface do provider implementam a real funcionalidade e
  357. todos os métodos públicos estão acessíveis como actions do provider.
  358. A interface ProviderManifestable de qualquer forma requer a implementação de um
  359. metodo <methodname>getProviders()</methodname> que reforna um array de
  360. instâncias da interface provider.
  361. </para>
  362. <para>
  363. As seguintes regras de nomeação aplicaveis em como você pode acessar os providers
  364. que foram encontrados pelo IncludePathLoader:
  365. </para>
  366. <itemizedlist>
  367. <listitem>
  368. <para>
  369. A última parte da sua divisão do classname por underscore é usado
  370. para o nome do provedor, por exemplo, "My_Provider_Hello" permite ao seu
  371. provider a ser acessível pelo nome de "hello".
  372. </para>
  373. </listitem>
  374. <listitem>
  375. <para>
  376. Se o seu provider tem um método <methodname>getName()</methodname>
  377. ele irá ser usado ao invés da maneira anterior para determinar
  378. o nome.
  379. </para>
  380. </listitem>
  381. <listitem>
  382. <para>
  383. Se o seu provider tem um prefixo "Provider", por exemplo ele é chamado
  384. de <classname>My_HelloProvider</classname>, isto será retirado
  385. do nome, assim o provider será chamado "hello".
  386. </para>
  387. </listitem>
  388. </itemizedlist>
  389. <note>
  390. <para>O IncludePathLoader não permite links simbólicos, que significa
  391. que você não pode linkar funcionalmente o provider no seus inclide paths,
  392. eles tem que estar fisicamente presentes nos inclide paths.</para>
  393. </note>
  394. <example
  395. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.loading.example">
  396. <title>Expondo Seus Providers com um Manifest</title>
  397. <para>
  398. Você pode expor seus providers para <classname>Zend_Tool</classname>
  399. oferecendo um manifest com a nome de arquivo especial terminando com
  400. "Manifest.php". Um Provider Manifest é uma implementação do
  401. <interface>Zend_Tool_Framework_Manifest_ProviderManifestable</interface>
  402. e requer o método <methodname>getProviders()</methodname> para retornar
  403. uma array providers instânciados. Em antecipação do seu primeiro próprio
  404. provider <classname>My_Component_HelloProvider</classname> nós iremos
  405. criar o seguinte manifest:
  406. </para>
  407. <programlisting language="php"><![CDATA[
  408. class My_Component_Manifest
  409. implements Zend_Tool_Framework_Manifest_ProviderManifestable
  410. {
  411. public function getProviders()
  412. {
  413. return array(
  414. new My_Component_HelloProvider()
  415. );
  416. }
  417. }
  418. ]]></programlisting>
  419. </example>
  420. </sect4>
  421. <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.basic">
  422. <title>Instruções Básicas para Criação de Providers</title>
  423. <para>
  424. Como um exemplo, se um desenvolvedor quer adicionar a capacidade de apresentar
  425. a versão de um arquivos de dados que seu componente de terceiros está usando,
  426. exite apenas uma classe que o desenvolvedor precisaria implementar.
  427. Asumindo que o componente é chamado <classname>My_Component</classname>,
  428. Ele poderia criar uma classe chamada <classname>My_Component_HelloProvider</classname>
  429. em um arquivo nomeado de <filename>HelloProvider.php</filename> em algum lugar no
  430. <property>include_path</property>. Esta classe implementaria <classname>Zend_Tool_Framework_Provider_Interface</classname>,
  431. e o corpo deste arquivo apenas teria que parecer com o seguinte:
  432. </para>
  433. <programlisting language="php"><![CDATA[
  434. class My_Component_HelloProvider
  435. implements Zend_Tool_Framework_Provider_Interface
  436. {
  437. public function say()
  438. {
  439. echo 'Hello from my provider!';
  440. }
  441. }
  442. ]]></programlisting>
  443. <para>
  444. Dado o códifo acima, e assumindo que o desenvolvedor deseja acessar
  445. esta funcionalidade através do cliente de console, a chamada se pareceria
  446. com isto:
  447. </para>
  448. <programlisting language="sh"><![CDATA[
  449. % zf say hello
  450. Hello from my provider!
  451. ]]></programlisting>
  452. </sect4>
  453. <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.response">
  454. <title>O objeto response</title>
  455. <para>
  456. Como assumido na arquitetura da sessão <classname>Zend_Tool</classname> permite
  457. unir diferentes cliente para usar o seus providers <classname>Zend_Tool</classname>.
  458. Para manter a conformidade com diferentes clientes você deve usar o objeto de resposta
  459. para retornar mensagens de seus providers em vez de usar <methodname>echo()</methodname>
  460. ou um mecanismo de saída semelhante. Reescrevendo nosso provider hello com este conhecimento
  461. isto vai se parecer com:
  462. </para>
  463. <programlisting language="php"><![CDATA[
  464. class My_Component_HelloProvider
  465. extends Zend_Tool_Framework_Provider_Abstract
  466. {
  467. public function say()
  468. {
  469. $this->_registry
  470. ->getResponse()
  471. ->appendContent("Hello from my provider!");
  472. }
  473. }
  474. ]]></programlisting>
  475. <para>
  476. Como você pode ser ele extende o
  477. <classname>Zend_Tool_Framework_Provider_Abstract</classname> para ter acesso
  478. ao Registry que guarda a instância do <classname>Zend_Tool_Framework_Client_Response</classname>.
  479. </para>
  480. </sect4>
  481. <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced">
  482. <title>Informações sobre Desenvolvimento Avançado</title>
  483. <sect5
  484. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.variables">
  485. <title>Passando variáveis para o Provider</title>
  486. <para>
  487. O exemplo "Hello World" acima é ótimo para comandos simples, mas
  488. o que dizer sobre algo mais avançado? Como seu script e ferramentas
  489. necessitam crescer, você pode achar que precisa da capacidade de aceitar
  490. variáveis. Bem como assinaturas de função têm parâmetros, a sua
  491. chamada para a ferramenta também podem aceitar parâmetros.
  492. </para>
  493. <para>
  494. Assim como cada requisição à ferramenta podem ser isolado a um método
  495. dentro de uma classe, os parâmetros de uma requisição à ferramenta
  496. também podem ser isolado em um lugar muito conhecido. Parâmetros dos
  497. métodos de ação de um provider podem incluir os mesmos parâmetros que
  498. você deseja que o seu cliente utilize ao chamar o provider e combinação
  499. de ações. Por exemplo, se você quiser aceitar um nome no exemplo acima,
  500. você provavelmente fazer isso em um código OO:
  501. </para>
  502. <programlisting language="php"><![CDATA[
  503. class My_Component_HelloProvider
  504. implements Zend_Tool_Framework_Provider_Interface
  505. {
  506. public function say($name = 'Ralph')
  507. {
  508. echo 'Hello' . $name . ', from my provider!';
  509. }
  510. }
  511. ]]></programlisting>
  512. <para>
  513. O exemplo acima pode então ser chamado via linha de comando
  514. <command>zf say hello Joe</command>. "Joe" será fornecido ao provider
  515. como um parametro do método chamado. Também note, como pode ser que o
  516. parametro é opcional, isto significa que ele é também opcional na linha
  517. de comando, assim <command>zf say hello</command> ainda funcionará, e
  518. por padrão o nome será "Ralph".
  519. </para>
  520. </sect5>
  521. <sect5
  522. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.prompt">
  523. <title>Solicitar Entrada ao Usuário</title>
  524. <para>
  525. Existem casos quando o workflow do seu provider requer
  526. solicitar o usuário entrada de dados. Isto pode ser feito,
  527. solicitando o cliente a pedir mais entradas necessárias chamando:
  528. </para>
  529. <programlisting language="php"><![CDATA[
  530. class My_Component_HelloProvider
  531. extends Zend_Tool_Framework_Provider_Abstract
  532. {
  533. public function say($name = 'Ralph')
  534. {
  535. $nameResponse = $this->_registry
  536. ->getClient()
  537. ->promptInteractiveInput("Whats your name?");
  538. $name = $nameResponse->getContent();
  539. echo 'Hello' . $name . ', from my provider!';
  540. }
  541. }
  542. ]]></programlisting>
  543. <para>
  544. Este comando dispara uma exceção se o cliente corrente não é
  545. capaz de manipular requisições interativas. No caso de o Cliente do Console
  546. padrão, contudo, você será solicitado a digitar o nome.
  547. </para>
  548. </sect5>
  549. <sect5
  550. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.pretendable">
  551. <title>Fingindo para executar um Provider Action</title>
  552. <para>
  553. Outra funcionalidade interessante que você pode desejar implementar
  554. é <emphasis>fingimento</emphasis>. Fingimento é a capacidade de seu
  555. provedor para "fingir" como se estivesse fazendo a ação solicitada e
  556. combinação de provedor e dar ao usuário o máximo de informações sobre
  557. o que <emphasis>faria</emphasis> sem realmente fazesse. Isso pode
  558. ser uma noção importante ao fazer banco de dados pesado ​​ou modificações
  559. do sistema de arquivos que o usuário não poderiam querer fazer.
  560. </para>
  561. <para>
  562. Fingimento é fácil de implementar. Existem duas partes para esta
  563. funcionalidade: 1) marcando o provider como tendo a habilidade para
  564. "fingir", e 2) verificando a requisição para garantir a requisição
  565. corrente foi de fato solicitada a ser "pretended". Esta funcionalidade
  566. é demostrada no simples código abaixo.
  567. </para>
  568. <programlisting language="php"><![CDATA[
  569. class My_Component_HelloProvider
  570. extends Zend_Tool_Framework_Provider_Abstract
  571. implements Zend_Tool_Framework_Provider_Pretendable
  572. {
  573. public function say($name = 'Ralph')
  574. {
  575. if ($this->_registry->getRequest()->isPretend()) {
  576. echo 'I would say hello to ' . $name . '.';
  577. } else {
  578. echo 'Hello' . $name . ', from my provider!';
  579. }
  580. }
  581. }
  582. ]]></programlisting>
  583. <para>
  584. Para rodar o provider em modo fingido apenas chame:
  585. </para>
  586. <programlisting language="sh"><![CDATA[
  587. % zf --pretend say hello Ralph
  588. I would say hello Ralph.
  589. ]]></programlisting>
  590. </sect5>
  591. <sect5
  592. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.verbosedebug">
  593. <title>Modos Verboso e Debug</title>
  594. <para>
  595. Você pode também rodar as suas actions do provider em modo "verboso" ou "debug".
  596. A semântica em relação a esta ações devem ser implementadas por você
  597. no contexto do seu provedor. Você pode acessar o modo debug ou verboso com:
  598. </para>
  599. <programlisting language="php"><![CDATA[
  600. class My_Component_HelloProvider
  601. implements Zend_Tool_Framework_Provider_Interface
  602. {
  603. public function say($name = 'Ralph')
  604. {
  605. if($this->_registry->getRequest()->isVerbose()) {
  606. echo "Hello::say has been called\n";
  607. }
  608. if($this->_registry->getRequest()->isDebug()) {
  609. syslog(LOG_INFO, "Hello::say has been called\n");
  610. }
  611. }
  612. }
  613. ]]></programlisting>
  614. </sect5>
  615. <sect5
  616. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.configstorage">
  617. <title>Acessando Configuração e Armazenamento de Usuário</title>
  618. <para>
  619. Usando a variável de Ambiente <property>ZF_CONFIG_FILE</property> ou o
  620. .zf.ini em seu diretório home você pode injetar parametros configuração em
  621. qualquer provider <classname>Zend_Tool</classname>. Acesso a esta configuração
  622. está disponível via registry que é passado para seu provider se você extender
  623. <classname>Zend_Tool_Framework_Provider_Abstract</classname>.
  624. </para>
  625. <programlisting language="php"><![CDATA[
  626. class My_Component_HelloProvider
  627. extends Zend_Tool_Framework_Provider_Abstract
  628. {
  629. public function say()
  630. {
  631. $username = $this->_registry->getConfig()->username;
  632. if(!empty($username)) {
  633. echo "Hello $username!";
  634. } else {
  635. echo "Hello!";
  636. }
  637. }
  638. }
  639. ]]></programlisting>
  640. <para>
  641. A configuração retornada está no tipo
  642. <classname>Zend_Tool_Framework_Client_Config</classname> mas internamente os
  643. métodos mágicos <methodname>__get()</methodname> and <methodname>__set()</methodname>
  644. encaminham para um <classname>Zend_Config</classname> do tipo de configuração
  645. fornecida.
  646. </para>
  647. <para>
  648. O armazenamento permite salvar dados arbitrarios para referenciar depois.
  649. Isto pode ser útil para tarefas de processamento em lote ou para re-executar
  650. sua tarefa. Você pode acessar o armazenamento em uma caminho similar ao
  651. da configuração:
  652. </para>
  653. <programlisting language="php"><![CDATA[
  654. class My_Component_HelloProvider
  655. extends Zend_Tool_Framework_Provider_Abstract
  656. {
  657. public function say()
  658. {
  659. $aValue = $this->_registry->getStorage()->get("myUsername");
  660. echo "Hello $aValue!";
  661. }
  662. }
  663. ]]></programlisting>
  664. <para>
  665. A <acronym>API</acronym> para o armazenamento é muito simples:
  666. </para>
  667. <programlisting language="php"><![CDATA[
  668. class Zend_Tool_Framework_Client_Storage
  669. {
  670. public function setAdapter($adapter);
  671. public function isEnabled();
  672. public function put($name, $value);
  673. public function get($name, $defaultValue=null);
  674. public function has($name);
  675. public function remove($name);
  676. public function getStreamUri($name);
  677. }
  678. ]]></programlisting>
  679. <important>
  680. <para>
  681. Ao projetar seus providers que estarão cientes do armazenamento e da
  682. configuração lembre-se de verificar se configurações de usuário ou
  683. chaves de armazenamento necessárias realmente existem para um usuário.
  684. Você não vai executar em erros fatais quando nenhuma dessas existir
  685. porém, desde que eles estejam vazios, são criados mediante solicitação.
  686. </para>
  687. </important>
  688. </sect5>
  689. </sect4>
  690. </sect3>
  691. </sect2>
  692. <sect2 id="zend.tool.extending.zend-tool-project">
  693. <title>Extensões Zend_Tool_Project</title>
  694. <para>
  695. <classname>Zend_Tool_Project</classname> expoe um rico conjunto de funcionalidades e
  696. capacidades que faz o tarefa de criação de novos providers, especificamente visando
  697. projetos mais fáceis e mais gerenciáveis.
  698. </para>
  699. <sect3 id="zend.tool.extending.zend-tool-project.architecture">
  700. <title>Arquitetura Geral</title>
  701. <para>
  702. Este mesmo conceito se aplica aos projetos Zend Framework. Em projetos de Zend Framework,
  703. você tem controllers, actions, views, models, bancos de dados e assim por diante. Em
  704. Termos de <classname>Zend_Tool</classname>, nós precisamos de um caminho para rastrear
  705. estes tipos de recursos - portanto <classname>Zend_Tool_Project</classname>.
  706. </para>
  707. <para>
  708. <classname>Zend_Tool_Project</classname> é capaz de rastrear os recursos do projeto
  709. ao longo do desenvolvimento de um projeto. Então, por exemplo, se em um comando você
  710. criar um controller, e no próximo comando você quiser criar uma action sem o controller,
  711. <classname>Zend_Tool_Project</classname> vai ter de <emphasis>saber</emphasis>
  712. sobre o arquivo controller que você criou de modo que você pode (na próxima ação),
  713. ser capaz de acrescentar a action a ele. Isto é o que mantém os nossos projetos
  714. em dia e <emphasis>monitorado</emphasis>.
  715. </para>
  716. <para>
  717. Outro ponto importante para entender é sobre projetos é que tipicamente, recursos
  718. são organizados em uma forma hierarquica. Com que em mente, <classname>Zend_Tool_Project</classname>
  719. é capaz de serializar o projeto corrente em uma representação interna que permite
  720. lhe permite acompanhar não só <emphasis>que</emphasis> recursos são parte de um projeto em um dado momento,
  721. mas também <emphasis>onde</emphasis> eles estão em relação uns aos outros.
  722. </para>
  723. </sect3>
  724. <sect3 id="zend.tool.extending.zend-tool-project.providers">
  725. <title>Criando Providers</title>
  726. <para>
  727. Providers específicos de projeto são criados da mesma forma como providers de serviços,
  728. com uma exceção: os providers de projeto devem estender de <classname>Zend_Tool_Project_Provider_Abstract</classname>.
  729. Esta classe vem com algumas funcionalidades significativas que ajudam os desenvolvedores
  730. a caregar o projeto existente, obter o objeto de profile, e ser capaz de pesquisar o profile,
  731. e depois armazenar quaisquer alterações ao profile do projeto atual.
  732. </para>
  733. <programlisting language="php"><![CDATA[
  734. class My_Component_HelloProvider
  735. extends Zend_Tool_Project_Provider_Abstract
  736. {
  737. public function say()
  738. {
  739. $profile = $this->_loadExistingProfile();
  740. /* ... do project stuff here */
  741. $this->_storeProfile();
  742. }
  743. }
  744. ]]></programlisting>
  745. </sect3>
  746. <!--
  747. <sect3 id="zend.tool.extending.zend-tool-project.resources-and-contexts">
  748. <title>Creating Resources &amp; Contexts</title>
  749. </sect3>
  750. -->
  751. </sect2>
  752. </sect1>