Zend_Tool-Extending.xml 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  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. necessidades crescem, você pode achar que você 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. Just as each tooling request can be isolated to a method within a
  495. class, the parameters of a tooling request can also be isolated in a
  496. very well known place. Parameters of the action methods of a
  497. provider can include the same parameters you want your client to
  498. utilize when calling that provider and action combination. For
  499. example, if you wanted to accept a name in the above example, you
  500. would probably do this in OO code:
  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. The above example can then be called via the command line
  514. <command>zf say hello Joe</command>. "Joe" will be supplied to the provider
  515. as a parameter of the method call. Also note, as you see that the
  516. parameter is optional, that means it is also optional on the command
  517. line, so that <command>zf say hello</command> will still work, and default
  518. to the name "Ralph".
  519. </para>
  520. </sect5>
  521. <sect5
  522. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.prompt">
  523. <title>Prompt the User for Input</title>
  524. <para>
  525. There are cases when the workflow of your provider requires
  526. to prompt the user for input. This can be done by requesting
  527. the client to ask for more the required input by calling:
  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. This command throws an exception if the current client is not
  545. able to handle interactive requests. In case of the default Console Client
  546. however you will be asked to enter the name.
  547. </para>
  548. </sect5>
  549. <sect5
  550. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.pretendable">
  551. <title>Pretending to execute a Provider Action</title>
  552. <para>
  553. Another interesting feature you might wish to implement is
  554. <emphasis>pretendability</emphasis>. Pretendabilty is the ability
  555. for your provider to "pretend" as if it is doing the requested
  556. action and provider combination and give the user as much
  557. information about what it <emphasis>would</emphasis> do without
  558. actually doing it. This might be an important notion when doing
  559. heavy database or filesystem modifications that the user might not
  560. otherwise want to do.
  561. </para>
  562. <para>
  563. Pretendability is easy to implement. There are two parts to this
  564. feature: 1) marking the provider as having the ability to "pretend",
  565. and 2) checking the request to ensure the current request was indeed
  566. asked to be "pretended". This feature is demonstrated in the code
  567. sample below.
  568. </para>
  569. <programlisting language="php"><![CDATA[
  570. class My_Component_HelloProvider
  571. extends Zend_Tool_Framework_Provider_Abstract
  572. implements Zend_Tool_Framework_Provider_Pretendable
  573. {
  574. public function say($name = 'Ralph')
  575. {
  576. if ($this->_registry->getRequest()->isPretend()) {
  577. echo 'I would say hello to ' . $name . '.';
  578. } else {
  579. echo 'Hello' . $name . ', from my provider!';
  580. }
  581. }
  582. }
  583. ]]></programlisting>
  584. <para>
  585. To run the provider in pretend mode just call:
  586. </para>
  587. <programlisting language="sh"><![CDATA[
  588. % zf --pretend say hello Ralph
  589. I would say hello Ralph.
  590. ]]></programlisting>
  591. </sect5>
  592. <sect5
  593. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.verbosedebug">
  594. <title>Verbose and Debug modes</title>
  595. <para>
  596. You can also run your provider actions in "verbose" or "debug" modes.
  597. The semantics in regard to this actions have to be implemented by you
  598. in the context of your provider. You can access debug or verbose modes
  599. with:
  600. </para>
  601. <programlisting language="php"><![CDATA[
  602. class My_Component_HelloProvider
  603. implements Zend_Tool_Framework_Provider_Interface
  604. {
  605. public function say($name = 'Ralph')
  606. {
  607. if($this->_registry->getRequest()->isVerbose()) {
  608. echo "Hello::say has been called\n";
  609. }
  610. if($this->_registry->getRequest()->isDebug()) {
  611. syslog(LOG_INFO, "Hello::say has been called\n");
  612. }
  613. }
  614. }
  615. ]]></programlisting>
  616. </sect5>
  617. <sect5
  618. id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.configstorage">
  619. <title>Accessing User Config and Storage</title>
  620. <para>
  621. Using the Enviroment variable <property>ZF_CONFIG_FILE</property> or the
  622. .zf.ini in your home directory you can inject configuration parameters into
  623. any <classname>Zend_Tool</classname> provider. Access to this configuration
  624. is available via the registry that is passed to your provider if you extend
  625. <classname>Zend_Tool_Framework_Provider_Abstract</classname>.
  626. </para>
  627. <programlisting language="php"><![CDATA[
  628. class My_Component_HelloProvider
  629. extends Zend_Tool_Framework_Provider_Abstract
  630. {
  631. public function say()
  632. {
  633. $username = $this->_registry->getConfig()->username;
  634. if(!empty($username)) {
  635. echo "Hello $username!";
  636. } else {
  637. echo "Hello!";
  638. }
  639. }
  640. }
  641. ]]></programlisting>
  642. <para>
  643. The returned configuration is of the type
  644. <classname>Zend_Tool_Framework_Client_Config</classname> but internally the
  645. <methodname>__get()</methodname> and <methodname>__set()</methodname> magic
  646. methods proxy to a <classname>Zend_Config</classname> of the given
  647. configuration type.
  648. </para>
  649. <para>
  650. The storage allows to save arbitrary data for later reference. This can be
  651. useful for batch processing tasks or for re-runs of your tasks. You can
  652. access the storage in a similar way like the configuration:
  653. </para>
  654. <programlisting language="php"><![CDATA[
  655. class My_Component_HelloProvider
  656. extends Zend_Tool_Framework_Provider_Abstract
  657. {
  658. public function say()
  659. {
  660. $aValue = $this->_registry->getStorage()->get("myUsername");
  661. echo "Hello $aValue!";
  662. }
  663. }
  664. ]]></programlisting>
  665. <para>
  666. The <acronym>API</acronym> of the storage is very simple:
  667. </para>
  668. <programlisting language="php"><![CDATA[
  669. class Zend_Tool_Framework_Client_Storage
  670. {
  671. public function setAdapter($adapter);
  672. public function isEnabled();
  673. public function put($name, $value);
  674. public function get($name, $defaultValue=null);
  675. public function has($name);
  676. public function remove($name);
  677. public function getStreamUri($name);
  678. }
  679. ]]></programlisting>
  680. <important>
  681. <para>
  682. When designing your providers that are config or storage aware remember
  683. to check if the required user-config or storage keys really exist for a
  684. user. You won't run into fatal errors when none of these are provided
  685. though, since empty ones are created upon request.
  686. </para>
  687. </important>
  688. </sect5>
  689. </sect4>
  690. </sect3>
  691. </sect2>
  692. <sect2 id="zend.tool.extending.zend-tool-project">
  693. <title>Zend_Tool_Project Extensions</title>
  694. <para>
  695. <classname>Zend_Tool_Project</classname> exposes a rich set of functionality and
  696. capabilities that make the task of creating new providers, specficially those targetting
  697. project easier and more manageable.
  698. </para>
  699. <sect3 id="zend.tool.extending.zend-tool-project.architecture">
  700. <title>Overall Architecture</title>
  701. <para>
  702. This same concept applies to Zend Framework projects. In Zend Framework projects,
  703. you have controllers, actions, views, models, databases and so on and so forth. In
  704. terms of <classname>Zend_Tool</classname>, we need a way to track these types of
  705. resources - thus <classname>Zend_Tool_Project</classname>.
  706. </para>
  707. <para>
  708. <classname>Zend_Tool_Project</classname> is capable of tracking project resources
  709. throughout the development of a project. So, for example, if in one command you
  710. created a controller, and in the next command you wish to create an action within
  711. that controller, <classname>Zend_Tool_Project</classname> is gonna have to
  712. <emphasis>know</emphasis> about the controller file you created so that you can (in
  713. the next action), be able to append that action to it. This is what keeps our
  714. projects up to date and <emphasis>stateful</emphasis>.
  715. </para>
  716. <para>
  717. Another important point to understand about projects is that typically, resources
  718. are organized in a hierarchical fashion. With that in mind,
  719. <classname>Zend_Tool_Project</classname> is capable of serializing the current
  720. project into a internal representation that allows it to keep track of not only
  721. <emphasis>what</emphasis> resources are part of a project at any given time, but
  722. also <emphasis>where</emphasis> they are in relation to one another.
  723. </para>
  724. </sect3>
  725. <sect3 id="zend.tool.extending.zend-tool-project.providers">
  726. <title>Creating Providers</title>
  727. <para>
  728. Project specific providers are created in the same fashion as plain framework
  729. providers, with one exception: project providers must extend the
  730. <classname>Zend_Tool_Project_Provider_Abstract</classname>. This class comes with
  731. some significant functionality that helps developers load existing project, obtian
  732. the profile object, and be able to search the profile, then later store any changes
  733. to the current project profile.
  734. </para>
  735. <programlisting language="php"><![CDATA[
  736. class My_Component_HelloProvider
  737. extends Zend_Tool_Project_Provider_Abstract
  738. {
  739. public function say()
  740. {
  741. $profile = $this->_loadExistingProfile();
  742. /* ... do project stuff here */
  743. $this->_storeProfile();
  744. }
  745. }
  746. ]]></programlisting>
  747. </sect3>
  748. <!--
  749. <sect3 id="zend.tool.extending.zend-tool-project.resources-and-contexts">
  750. <title>Creating Resources &amp; Contexts</title>
  751. </sect3>
  752. -->
  753. </sect2>
  754. </sect1>