Zend_Application-Examples.xml 8.4 KB

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