plugins-usage.xml 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.plugins.usage">
  5. <title>Utilizando Plugins</title>
  6. <para>
  7. Componentes que fazem uso de plugins normalmente utilizam
  8. <classname>Zend_Loader_PluginLoader</classname>. Essa classe permite que você registre
  9. plugins especificando um ou mais "caminhos prefixados". O componente irá chamar ao método
  10. de PluginLoader <methodname>load()</methodname>, passando o nome abreviado do plugin.
  11. O PluginLoader irá consultar cada caminho prefixado para saber se existe uma classe
  12. correspondente. Os caminhos prefixados são procurados na ordem LIFO (last in, first
  13. out - último a entrar, primeiro a sair), e com isso, as correspondências ocorrerão
  14. primeiramente com os últimos caminhos registrados - o que possibilita a você substituir
  15. plugins já existentes.
  16. </para>
  17. <para>
  18. Os exemplos seguintes deixarão isso mais claro.
  19. </para>
  20. <example id="learning.plugins.usage.basic">
  21. <title>Exemplo básico de Plugin: Adicionando um caminho prefixado</title>
  22. <para>
  23. Neste exemplo, vamos supor que alguns validadores foram escritos e colocados no
  24. diretório <filename>foo/plugins/validators/</filename>, e que todas essas classes
  25. possuem o prefixo "Foo_Validate_"; essas duas partes de informação formam o
  26. "caminho prefixado".
  27. Além disso, vamos supor que temos dois validadores, um chamado "Par" (garantindo que
  28. um número seja par), e outro chamado "Dúzias" (garantindo que o número é um múltiplo
  29. de 12). A árvore terá esta aparência:
  30. </para>
  31. <programlisting language="text"><![CDATA[
  32. foo/
  33. |-- plugins/
  34. | |-- validators/
  35. | | |-- Par.php
  36. | | |-- Duzias.php
  37. ]]></programlisting>
  38. <para>
  39. Agora, vamos informar uma instância de <classname>Zend_Form_Element</classname>
  40. deste caminho prefixado. O método <methodname>addPrefixPath()</methodname> da classe
  41. <classname>Zend_Form_Element</classname> espera um terceiro argumento que indica
  42. o tipo de plugin para o qual o caminho está sendo registrado, neste caso, é um
  43. plugin "validador".
  44. </para>
  45. <programlisting language="php"><![CDATA[
  46. $element->addPrefixPath('Foo_Validate', 'foo/plugins/validators/', 'validate');
  47. ]]></programlisting>
  48. <para>
  49. Agora podemos simplesmente informar ao elemento o nome abreviado dos validadores que
  50. queremos usar. No exemplo seguinte, usaremos uma mistura de validadores padrão
  51. ("NotEmpty", "Int") e validadores customizados ("Par", "Duzias"):
  52. </para>
  53. <programlisting language="php"><![CDATA[
  54. $element->addValidator('NotEmpty')
  55. ->addValidator('Int')
  56. ->addValidator('Par')
  57. ->addValidator('Duzias');
  58. ]]></programlisting>
  59. <para>
  60. Quando o elemento demanda validação, requisitará a classe de plugin através do
  61. PluginLoader. Os dois primeiros validadores serão
  62. <classname>Zend_Validate_NotEmpty</classname> e
  63. <classname>Zend_Validate_Int</classname>, respectivamente; os dois seguintes serão
  64. <classname>Foo_Validate_Par</classname> e <classname>Foo_Validate_Duzias</classname>,
  65. respectivamente.
  66. </para>
  67. </example>
  68. <note>
  69. <title>O que acontece caso um plugin não seja encontrado?</title>
  70. <para>
  71. O que acontece se um plugin é solicitado, mas o PluginLoader é incapaz de encontrar
  72. uma classe correspondente? Por exemplo, no exemplo acima, se registrássemos o plugin
  73. "Bar", com o elemento, o que aconteceria?
  74. </para>
  75. <para>
  76. O carregador de plugin irá procurar em cada caminho prefixado, verificando se há um
  77. arquivo correspondente ao nome do plugin. Se o arquivo não for encontrado, ele passa
  78. ao próximo caminho prefixado.
  79. </para>
  80. <para>
  81. Uma vez que a pilha de caminhos prefixados tenha se esgotado, caso nenhum arquivo
  82. tenha sido encontrado, será gerada uma exceção
  83. <exceptionname>Zend_Loader_PluginLoader_Exception</exceptionname>.
  84. </para>
  85. </note>
  86. <example id="learning.plugins.usage.override">
  87. <title>Uso Intermediário do Plugin: Sobrescrevendo plugins existentes</title>
  88. <para>
  89. Uma característica do PluginLoader é que seu uso da pilha LIFO permite sobrescrever
  90. plugins existentes, criando sua própria versão localmente com um caminho prefixado
  91. diferente e registrá-lo mais tarde na pilha.
  92. </para>
  93. <para>
  94. Por exemplo, vamos considerar <classname>Zend_View_Helper_FormButton</classname>
  95. (auxiliares de visualização - view helpers - são um tipo de plugin). Esse auxiliar de
  96. visualização aceita três argumentos, um nome de elemento (também usado como seu
  97. identificador DOM), um valor (usado como o rótulo do botão) e um vetor opcional de
  98. atributos. O auxiliar gera marcação <acronym>HTML</acronym> para um elemento de
  99. inserção em formulário.
  100. </para>
  101. <para>
  102. Digamos que você deseja que o auxiliar, ao invés de gerar um elemento
  103. <constant>button</constant> em <acronym>HTML</acronym>; não quer que o auxiliar
  104. gere um identificador DOM, mas sim utilizar o valor para um seletor de classe em CSS;
  105. sem interesse em manipular atributos arbitrários.
  106. Você pode fazer isso de algumas maneiras. Em todos os casos, você criaria sua própria
  107. classe "auxiliar de visualização" que implementa o comportamento desejado;
  108. a diferença está em como você iria nomeá-los e chamá-los.
  109. </para>
  110. <para>
  111. Nosso primeiro exemplo será o de nomear o elemento com um nome único:
  112. <classname>Foo_View_Helper_CssButton</classname>, o que implica no nome do plugin
  113. "CssButton". Embora isso seja uma abordagem viável, apresenta várias questões: caso
  114. você já tenha utilizado o auxiliar de visualização Button, você terá que refatorar;
  115. em outro caso, se outro desenvolvedor começar a escrever código para a sua aplicação,
  116. pode inadvertidamente usar o auxiliar de visualização Button em vez de seu novo
  117. auxiliar.
  118. </para>
  119. <para>
  120. Então, o melhor exemplo é usar o plugin de nome "Button", ficando o nome da classe
  121. como <classname>Foo_View_Helper_Button</classname>. Em seguida, registrar o caminho
  122. prefixado com a visualização (view):
  123. </para>
  124. <programlisting language="php"><![CDATA[
  125. // Zend_View::addHelperPath() utiliza o PluginLoader; entretanto, inverte
  126. // os argumentos e fornece o valor padrão de "Zend_View_Helper" para o
  127. // prefixo de plugin.
  128. //
  129. // O código abaixo assume que sua classe está no diretório 'foo/view/helpers/'.
  130. $view->addHelperPath('foo/view/helpers', 'Foo_View_Helper');
  131. ]]></programlisting>
  132. <para>
  133. Uma vez feito, em qualquer lugar que utilizar o auxiliar "Button" irá direcionar para
  134. a sua classe <classname>Foo_View_Helper_Button</classname> customizada!
  135. </para>
  136. </example>
  137. </sect1>