Zend_Tool_Framework-WritingProviders.xml 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 16656 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.tool.framework.writing-providers">
  5. <title>Erstellen von Providern für die Verwendung mit Zend_Tool_Framework</title>
  6. <para>
  7. Generell ist ein Provider für sich selbst nichts mehr als die Shell für einen Entwickler
  8. um einige Fähigkeiten zu bündeln die man mit dem Kommandozeilen (oder einem anderen)
  9. Client ausliefern will. Das ist analog zu dem was ein "Controller" in einer
  10. <acronym>MVC</acronym> Anwendung ist.
  11. </para>
  12. <sect2 id="zend.tool.framework.writing-providers.basic">
  13. <title>Grundsätzliche Anweisungen für die Erstellung von Providern</title>
  14. <para>
  15. Wenn, als Beispiel, ein Entwickler die Fähigkeit hinzufügen will, die Version einer
  16. Datendatei anzuzeigen, mit der seine 3rd Party Komponente arbeitet, gibt es nur eine
  17. Klasse die der Entwickler implementieren muss. Angenommen die Komponente heisst
  18. <classname>My_Component</classname>, dann würde er eine Klasse erstellen die
  19. <classname>My_Component_HelloProvider</classname> heisst und in einer Datei ist die
  20. <filename>HelloProvider.php</filename> heisst und irgendwo im
  21. <property>include_path</property> ist. Diese Klasse würde
  22. <classname>Zend_Tool_Framework_Provider_Interface</classname> implementieren, und der
  23. Body dieser Datei würde nur wie folgt auszusehen haben:
  24. </para>
  25. <programlisting language="php"><![CDATA[
  26. class My_Component_HelloProvider
  27. implements Zend_Tool_Framework_Provider_Interface
  28. {
  29. public function say()
  30. {
  31. echo 'Hallo von meinem Provider!';
  32. }
  33. }
  34. ]]></programlisting>
  35. <para>
  36. Durch den obigen Code, und der Annahme das der Entwickler den Zugriff auf diese
  37. funktionalität über den Consolen Client will, würde der Aufruf wie folgt aussehen:
  38. </para>
  39. <programlisting language="sh"><![CDATA[
  40. % zf say hello
  41. Hello from my provider!
  42. ]]></programlisting>
  43. </sect2>
  44. <sect2 id="zend.tool.framework.writing-providers.advanced">
  45. <title>Fortgeschrittene Informationen für die Entwicklung</title>
  46. <para>
  47. Das obige "Hello World" Beispiel ist perfekt für einfache Kommandos, aber was ist mit
  48. etwas fortgeschrittenerem? Wenn das Scripting und Tooling wächst, kann die
  49. Notwendigkeit entstehen Variablen zu akzeptieren. So wie Signaturen von Funktionen
  50. Parameter haben, kann eine Tooling Anfrage auch Parameter akzeptieren.
  51. </para>
  52. <para>
  53. So wie jede Tooling Anfrage in einer Methode in einer Klasse isoliert werden kann,
  54. können die Parameter einer Tooling Anfrage auch in einem sehr bekannten Platz isoliert
  55. werden. Parameter von Action Methoden eines Providers können die selben Parameter
  56. enthalten die man im Client verwenden will, wenn man den Namen im obigen Beispiel
  57. akzeptieren will, und man würde das in OO Code warscheinlich wie folgt tun:
  58. </para>
  59. <programlisting language="php"><![CDATA[
  60. class My_Component_HelloProvider
  61. implements Zend_Tool_Framework_Provider_Interface
  62. {
  63. public function say($name = 'Ralph')
  64. {
  65. echo 'Hallo' . $name . ', von meinem Provider!';
  66. }
  67. }
  68. ]]></programlisting>
  69. <para>
  70. Das obige Beispiel kann pber di Kommandozeile wie folgt aufgerufen werden:
  71. <command>zf say hello Joe</command>. "Joe" wird dem Provider als Parameter des
  72. Methodenaufrufs zur Verfügung gestellt. Es ist auch zu beachten das der Parameter
  73. optional ist, was bedeutet das er auch auf der Kommandozeile optional ist, so das
  74. <command>zf say hello</command> weiterhin funktioniert, und der Standardname "Ralph"
  75. ist.
  76. </para>
  77. <para>
  78. Ein anderes interessantes Feature das man implementieren kann ist
  79. <emphasis>Voranstellbarkeit</emphasis>. Voranstellbarkeit ist die Fähigkeit des
  80. Providers "Voranzustellen" wie wenn er die angefragte Aktion und Provider
  81. Kombination ausführt, und dem Benutzer so viel Information wie möglich darüber gibt
  82. was er tun <emphasis>würde</emphasis> ohne es wirklich zu tun. Das kann eine wichtige
  83. Option sein wenn viele Datenbank oder Dateisystem Änderungen durchzuführen sind, die
  84. der Benutzer andernfalls nicht tun würde.
  85. </para>
  86. <para>
  87. Voranstellbarkeit ist einfach zu implementieren. Es gibt zwei Teile dieses Features:
  88. 1) Markieren des Providers, das er die Fähigkeit des "voranstellens" hat und 2) prüfen
  89. der Anfrage um Sicherzustellen das die aktuelle Anfrage wirklich das "voranstellen"
  90. angefragt hat. Dieses Feature wird im nächsten Code Beispiel demonstriert.
  91. </para>
  92. <programlisting language="php"><![CDATA[
  93. class My_Component_HelloProvider
  94. extends Zend_Tool_Framework_Provider_Abstract
  95. implements Zend_Tool_Framework_Provider_Pretendable
  96. {
  97. public function say($name = 'Ralph')
  98. {
  99. if ($this->_registry->getRequest()->isPretend()) {
  100. echo 'Ich würde zu ' . $name . ' hallo sagen.';
  101. } else {
  102. echo 'Hallo' . $name . ', von meinem Provider!';
  103. }
  104. }
  105. }
  106. ]]></programlisting>
  107. </sect2>
  108. </sect1>