Zend_Application-Examples.xml 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 22448 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.application.examples">
  5. <title>Beispiele</title>
  6. <para>
  7. Die Bootstrap Klasse selbst wird typischerweise sehr minimal sein; oft wird sie einfach
  8. nur ein leerer Stub sein der die Basis Bootstrapping Klasse erweitert:
  9. </para>
  10. <programlisting language="php"><![CDATA[
  11. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  12. {
  13. }
  14. ]]></programlisting>
  15. <para>
  16. Mit einer entsprechenden Konfigurationsdatei:
  17. </para>
  18. <programlisting language="ini"><![CDATA[
  19. ; APPLICATION_PATH/configs/application.ini
  20. [production]
  21. autoloaderNamespaces[] = "My_"
  22. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  23. bootstrap.class = "Bootstrap"
  24. pluginpaths.My_Bootstrap_Resource = "My/Bootstrap/Resource"
  25. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  26. [testing: production]
  27. [development : production]
  28. ]]></programlisting>
  29. <note>
  30. <title>Namespaces für Autoloader</title>
  31. <para>
  32. Weil diese Beispiele eigenen Code verwenden müssen wir die Präfixe der Namespaces
  33. für diesen Code in unserer Konfiguration registrieren; dies wird mit dem
  34. Konfigurationsschlüssel <code>autoloaderNamespaces</code> getan, welcher ein Array ist.
  35. </para>
  36. <para>
  37. Zusätzlich, um sicherzustellen das eigene Plugin Ressourcen erkannt werden, müssen wir
  38. einen Plugin Präfix Pfad in der Bootstrap registrieren. Das wird mit dem
  39. Konfigurationsschlüssel <code>pluginpaths</code> getan, welcher ein assoziatives Array
  40. ist, mit Schlüsseln die den zu verwendenden Präfix kennzeichnen , und Werten welche den
  41. Pfad kennzeichnen der diesem Präfix entspricht.
  42. </para>
  43. </note>
  44. <para>
  45. Sollten trotzdem, eigene Initialisierungen notwendig sein, hat man zwei Möglichkeiten.
  46. Erstens, kann man Methoden schreiben die mit <emphasis>_init</emphasis> anfangen um eigenen
  47. Code zu spezifizieren der für das Bootstrapping verwendet werden soll. Diese Methoden
  48. werden durch <methodname>bootstrap()</methodname> aufgerufen, und können genauso aufgerufen
  49. werden, wie wenn Sie öffentliche Methoden wären:
  50. <emphasis>bootstrap&lt;resource&gt;()</emphasis>. Sie sollten ein optionales Array an
  51. Optionen akzeptieren.
  52. </para>
  53. <para>
  54. Wenn die eigene Ressource Methode einen Wert zurückgibt, wird diese in einem Container
  55. im Bootstrap gespeichert. Das kann nützlich sein, wenn verschiedene Ressourcen interagieren
  56. müssen (wie wenn eine Ressource sich selbst in eine andere Iniziiert). Die Methode
  57. <methodname>getResource()</methodname> kann dann verwendet werden, um diese Werte zu
  58. erhalten.
  59. </para>
  60. <para>
  61. Das Beispiel anbei zeigt eine Ressource Methode für die Initialisierung des Anfrage
  62. Objekts. Es verwendet die Erkennung der Abhängigkeit (diese hängt von der Front Controller
  63. Ressource ab), holt eine Ressource vom Bootstrap, und gibt einen Wert zurück, um ihn im
  64. Bootstrap zu speichern.
  65. </para>
  66. <programlisting language="php"><![CDATA[
  67. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  68. {
  69. protected function _initRequest()
  70. {
  71. // Sicherstellen das eine Front Controller Instanz vorhanden ist
  72. // und diese holen
  73. $this->bootstrap('FrontController');
  74. $front = $this->getResource('FrontController');
  75. // Das Anfrage Objekt initialisieren
  76. $request = new Zend_Controller_Request_Http();
  77. $request->setBaseUrl('/foo');
  78. // Sie dem Front Controller hinzufügen
  79. $front->setRequest($request);
  80. // Bootstrap speichert den Wert im 'request' Schlüssel
  81. // seines Containers
  82. return $request;
  83. }
  84. }
  85. ]]></programlisting>
  86. <para>
  87. Beachte in diesem Beispiel den Aufruf von <methodname>bootstrap()</methodname>; dieser
  88. stellt sicher, dass der Front Controller initialisiert wurde bevor die Methode aufgerufen
  89. wird. Dieser Aufruf kann entweder eine Ressource oder eine andere Methode in der Klasse
  90. auslösen.
  91. </para>
  92. <para>
  93. Die andere Option ist, die Verwendung eines Ressource Plugins. Ressource Plugins sind
  94. Objekte die spezielle Initialisierungen ausführen, und die wie folgt spezifiziert werden
  95. können:
  96. </para>
  97. <itemizedlist>
  98. <listitem>
  99. <para>
  100. Während der Instanzierung des <classname>Zend_Application</classname> Objekts
  101. </para>
  102. </listitem>
  103. <listitem>
  104. <para>
  105. Während der Initialisierung des Bootstrap Objekts
  106. </para>
  107. </listitem>
  108. <listitem>
  109. <para>
  110. Durch explizites Einschalten über Methodenaufrufe auf dem Bootstrap Objekt
  111. </para>
  112. </listitem>
  113. </itemizedlist>
  114. <para>
  115. Ressource Plugins implementieren
  116. <classname>Zend_Application_Resource_ResourceAbstract</classname>, welche einfach
  117. definieren, dass sie Injektion des Aufrufers und von Optionen erlauben, und die eine
  118. <methodname>init()</methodname> Methode haben. Als Beispiel, könnte eine eigene "View"
  119. Bootstrap Ressource wie folgt aussehen:
  120. </para>
  121. <programlisting language="php"><![CDATA[
  122. class My_Bootstrap_Resource_View
  123. extends Zend_Application_Resource_ResourceAbstract
  124. {
  125. public function init()
  126. {
  127. $view = new Zend_View($this->_getOptions());
  128. Zend_Dojo::enableView($view);
  129. $view->doctype('XHTML1_STRICT');
  130. $view->headTitle()->setSeparator(' - ')->append('Meine Site');
  131. $view->headMeta()->appendHttpEquiv('Content-Type',
  132. 'text/html; charset=utf-8');
  133. $view->dojo()->setDjConfigOption('parseOnLoad', true)
  134. ->setLocalPath('/js/dojo/dojo.js')
  135. ->registerModulePath('../spindle', 'spindle')
  136. ->addStylesheetModule('spindle.themes.spindle')
  137. ->requireModule('spindle.main')
  138. ->disable();
  139. $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
  140. 'ViewRenderer'
  141. );
  142. $viewRenderer->setView($view);
  143. return $view;
  144. }
  145. }
  146. ]]></programlisting>
  147. <para>
  148. Um der Bootstrap zu sagen, dass sie das verwenden soll, würde man entweder den Klassennamen
  149. des Ressource Plugins übergeben müssen, oder eine Kombination eines Plugin Loader
  150. Präfixpfades und den Kurznamen des Ressource Plugins (z.B. "view"):
  151. </para>
  152. <programlisting language="php"><![CDATA[
  153. $application = new Zend_Application(
  154. APPLICATION_ENV,
  155. array(
  156. 'resources' => array(
  157. 'My_Bootstrap_Resource_View' => array(), // kompletter Klassenname
  158. 'view', // ODER Kurzname
  159. 'FrontController' => array(
  160. 'controllerDirectory' => APPLICATION_PATH . '/controllers',
  161. ),
  162. ),
  163. // Für Kurznamen, definiere die Plugin Pfade:
  164. 'pluginPaths = array(
  165. 'My_Bootstrap_Resource' => 'My/Bootstrap/Resource',
  166. )
  167. )
  168. );
  169. ]]></programlisting>
  170. <para>
  171. Ressource Plugins können andere Ressourcen und Initialisierungen aufrufen, indem Sie auf den
  172. Eltern-Bootstrap zugreifen:
  173. </para>
  174. <programlisting language="php"><![CDATA[
  175. class My_Bootstrap_Resource_Layout
  176. extends Zend_Application_Resource_ResourceAbstract
  177. {
  178. public function init()
  179. {
  180. // Sicherstellen das die View initialisiert ist...
  181. $this->getBootstrap()->bootstrap('view');
  182. // Das View Objekt erhalten
  183. $view = $this->getBootstrap()->getResource('view');
  184. // ...
  185. }
  186. }
  187. ]]></programlisting>
  188. <para>
  189. Bei normaler Verwendung, würde man die Anwendung instanzieren, sie bootstrappen, und
  190. anschließend ausführen:
  191. </para>
  192. <programlisting language="php"><![CDATA[
  193. $application = new Zend_Application(...);
  194. $application->bootstrap()
  195. ->run();
  196. ]]></programlisting>
  197. <para>
  198. Für ein eigenes Skript müsste man einfach spezifische Ressourcen initialisieren:
  199. </para>
  200. <programlisting language="php"><![CDATA[
  201. $application = new Zend_Application(...);
  202. $application->getBootstrap('db');
  203. $service = new Zend_XmlRpc_Server();
  204. $service->setClass('Foo'); // Verwende die Datenbank...
  205. echo $service->handle();
  206. ]]></programlisting>
  207. <para>
  208. Statt der Verwendung der <methodname>bootstrap()</methodname> Methode, um interne Methoden
  209. oder Ressourcen aufzurufen, kann man auch Überladung verwenden:
  210. </para>
  211. <programlisting language="php"><![CDATA[
  212. $application = new Zend_Application(...);
  213. $application->getBootstrapDb();
  214. ]]></programlisting>
  215. </sect1>