Zend_Application-TheoryOfOperation.xml 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: 20763 -->
  4. <sect1 id="zend.application.theory-of-operation">
  5. <title>Arbeitsweise</title>
  6. <para>
  7. Um eine <acronym>MVC</acronym>-Anwendung zu konfigurieren und bereit zur Auslieferung
  8. zu bekommen wird ein immer größerer Anteil an Code benötigt, sobald mehr Features verfügbar
  9. sind: Setzen der Datenbank, Konfiguration der View und View Helfer, Konfiguration der
  10. Layouts, Registrierung der Plugins, Registrierung der Aktion Helfer, und andere.
  11. </para>
  12. <para>
  13. Zusätzlich will man oft den gleichen Code wiederverwenden, um Tests zu bootstrappen, einen
  14. Cronjob, oder ein Service-Skript zu haben. Wärend es sehr einfach ist, sein Bootstrap-Skript
  15. einzubauen, gibt es oft Initialisierungen, die abhängig von der Umgebung sind - man
  16. benötigt kein <acronym>MVC</acronym> für einen Cronjob, oder nur den DB-Layer für ein
  17. Service-Skript.
  18. </para>
  19. <para>
  20. <classname>Zend_Application</classname> zielt darauf ab, das alles einfacher zu machen und
  21. bietet Wiederverwendbarkeit durch die Kapselung des Bootstrapping in
  22. <acronym>OOP</acronym>-Paradigmen.
  23. </para>
  24. <para>
  25. <classname>Zend_Application</classname> ist in drei Bereiche geteilt:
  26. </para>
  27. <itemizedlist>
  28. <listitem>
  29. <para>
  30. <classname>Zend_Application</classname>: Lädt die <acronym>PHP</acronym>-Umgebung,
  31. inklusive Inklude-Pfade und Autoloading, und instanziiert die benötigte
  32. Bootstrap-Klasse.
  33. </para>
  34. </listitem>
  35. <listitem>
  36. <para>
  37. <classname>Zend_Application_Bootstrap</classname>: Bietet Interfaces für
  38. Bootstrap-Klassen. <classname>Zend_Application_Bootstrap_Bootstrap</classname> bietet
  39. übliche Funktionalitäten für die meisten Notwendigkeiten des Bootstrappings,
  40. inklusive Algorithmen um Abhängigkeiten zu prüfen und die Möglichkeit
  41. Bootstrap-Ressourcen bei Bedarf zu laden.
  42. </para>
  43. </listitem>
  44. <listitem>
  45. <para>
  46. <classname>Zend_Application_Resource</classname> bietet ein Interface für Standard
  47. Bootstrap-Ressourcen, die bei Bedarf von einer Bootstrap-Instanz geladen werden
  48. können, sowie verschiedene standardmäßige Ressource-Implementationen.
  49. </para>
  50. </listitem>
  51. </itemizedlist>
  52. <para>
  53. Entwickler erstellen eine Bootstrap-Klasse für ihre Anwendung und erweitern
  54. <classname>Zend_Application_Bootstrap_Bootstrap</classname> oder implementieren (mindestens)
  55. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>. Der Einstiegspunkt
  56. (z.B. <filename>public/index.php</filename>) lädt <classname>Zend_Application</classname>
  57. und initialisiert sie, indem folgendes übergeben wird:
  58. </para>
  59. <itemizedlist>
  60. <listitem><para>Die aktuelle Umgebung</para></listitem>
  61. <listitem><para>Optionen für das Bootstrapping</para></listitem>
  62. </itemizedlist>
  63. <para>
  64. Die Bootstrap-Optionen enthalten den Pfad zur Datei, welche die Bootstrap-Klasse enthält und
  65. optional:
  66. </para>
  67. <itemizedlist>
  68. <listitem>
  69. <para>Jeden include_path der extra zu setzen ist</para>
  70. </listitem>
  71. <listitem>
  72. <para>Jeden Autoloader Namespace, der zusätzlich zu registrieren ist</para>
  73. </listitem>
  74. <listitem>
  75. <para>Jede <filename>php.ini</filename> Einstellung, die zu initialisieren ist</para>
  76. </listitem>
  77. <listitem>
  78. <para>
  79. Den Klassennamen für die Bootstrap-Klasse (wenn diese nicht "Bootstrap" ist)
  80. </para>
  81. </listitem>
  82. <listitem>
  83. <para>Ressourcen-Präfix zu Pfadpaaren, die zu verwenden sind</para>
  84. </listitem>
  85. <listitem>
  86. <para>Jede Ressource, die zu verwenden ist (durch Name der Klasse oder Kurzname)</para>
  87. </listitem>
  88. <listitem>
  89. <para>Zusätzliche Pfade zu einer Konfigurationsdatei, die zu laden ist</para>
  90. </listitem>
  91. <listitem>
  92. <para>Zusätzliche Konfigurationsoptionen</para>
  93. </listitem>
  94. </itemizedlist>
  95. <para>
  96. Optionen können ein Array, ein <classname>Zend_Config</classname>-Objekt, oder der Pfad zu
  97. einer Konfigurationsdatei sein.
  98. </para>
  99. <sect2 id="zend.application.theory-of-operation.bootstrap">
  100. <title>Bootstrapping</title>
  101. <para>
  102. Der zweite Aufgabenbereich von<classname>Zend_Application</classname> ist die Ausführung
  103. des Bootstraps der Anwendung. Bootstraps müssen mindestens
  104. <classname>Zend_Application_Bootstrap_Bootstrapper</classname> implementieren, welches
  105. die folgende <acronym>API</acronym> definiert:
  106. </para>
  107. <programlisting language="php"><![CDATA[
  108. interface Zend_Application_Bootstrap_Bootstrapper
  109. {
  110. public function __construct($application);
  111. public function setOptions(array $options);
  112. public function getApplication();
  113. public function getEnvironment();
  114. public function getClassResources();
  115. public function getClassResourceNames();
  116. public function bootstrap($resource = null);
  117. public function run();
  118. }
  119. ]]></programlisting>
  120. <para>
  121. Diese <acronym>API</acronym> erlaubt es dem Bootstrap die Umgebung und die
  122. Konfiguration vom Objekt der Anwendung zu akzeptieren, die Ressourcen die für das
  123. Bootstrapping verantwortlich sind zu melden, und dann das Bootstrappen ausführen und
  124. die Anwendung zu starten.
  125. </para>
  126. <para>
  127. Man kann dieses Interface selbst implementieren,
  128. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname> erweitern, oder
  129. <classname>Zend_Application_Bootstrap_Bootstrap</classname> verwenden.
  130. </para>
  131. <para>
  132. Neben dieser Funktionalität gibt es eine Anzahl anderer Gebiete von Interesse mit denen
  133. man vertraut sein sollte.
  134. </para>
  135. <sect3 id="zend.application.theory-of-operation.bootstrap.resource-methods">
  136. <title>Methoden für Ressourcen</title>
  137. <para>
  138. Die Implementation von
  139. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname> bietet eine
  140. einfache Konvention für die Definition von Methoden für Ressourcen-Klassen. Jede
  141. geschützte Methode (protected), deren Name mit <emphasis>_init</emphasis> beginnt,
  142. wird als Ressourcemethode angenommen.
  143. </para>
  144. <para>
  145. Um eine einzelne Ressource-Methode zu bootstrappen, muß die
  146. Methode <methodname>bootstrap()</methodname> verwendet und der Name der Ressource
  147. übergeben werden. Der Name ist der Name der Methode ohne das
  148. Präfix <emphasis>_init</emphasis>.
  149. </para>
  150. <para>
  151. Um mehrere Ressourcen-Methoden zu bootstrappen, muß ein Array von Namen übergeben
  152. werden. Um alle Ressourcen-Methoden zu bootstrappen, darf nichts übergeben werden.
  153. </para>
  154. <para>
  155. Nehmen wir die folgende Bootstrap-Klasse an:
  156. </para>
  157. <programlisting language="php"><![CDATA[
  158. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  159. {
  160. protected function _initFoo()
  161. {
  162. // ...
  163. }
  164. protected function _initBar()
  165. {
  166. // ...
  167. }
  168. protected function _initBaz()
  169. {
  170. // ...
  171. }
  172. }
  173. ]]></programlisting>
  174. <para>
  175. Um nur die Methode <methodname>_initFoo()</methodname> zu bootstrappen, machen wir
  176. das folgende:
  177. </para>
  178. <programlisting language="php"><![CDATA[
  179. $bootstrap->bootstrap('foo');
  180. ]]></programlisting>
  181. <para>
  182. Um die Methoden <methodname>_initFoo()</methodname> und
  183. <methodname>_initBar()</methodname> zu bootstrappen, machen wir das folgende:
  184. </para>
  185. <programlisting language="php"><![CDATA[
  186. $bootstrap->bootstrap(array('foo', 'bar'));
  187. ]]></programlisting>
  188. <para>
  189. Um alle Ressourcen-Methoden zu bootstrappen, rufen wir
  190. <methodname>bootstrap()</methodname> ohne Argumente auf:
  191. </para>
  192. <programlisting language="php"><![CDATA[
  193. $bootstrap->bootstrap();
  194. ]]></programlisting>
  195. </sect3>
  196. <sect3 id="zend.application.theory-of-operation.bootstrap.resource-plugins">
  197. <title>Bootstraps, die Ressourcen-Plugins benutzen</title>
  198. <para>
  199. Um Bootstraps wiederverwendbarer zu machen, wurde die Fähigkeit zur Verfügung
  200. gestellt, Ressourcen in Ressource-Plugin-Klassen zu geben. Das erlaubt es, Ressourcen
  201. einfach über die Konfiguration zu mischen und zu sehen ob sie passen. Wir behandeln
  202. später <link linkend="zend.application.theory-of-operation.resources">wie
  203. Ressourcen erstellt werden</link>; in diesem Abschnitt zeigen wir nur, wie sie
  204. angepasst werden können.
  205. </para>
  206. <para>
  207. Wenn das Bootstrap dazu in der Lage sein soll, Ressource-Plugins zu verwenden, muß
  208. man ein zusätzliches Interface implementieren,
  209. <classname>Zend_Application_Bootstrap_ResourceBootstrapper</classname>. Dieses
  210. Interface definiert eine <acronym>API</acronym> für das Erkennen, Registrieren und
  211. Laden von Ressource-Plugins:
  212. </para>
  213. <programlisting language="php"><![CDATA[
  214. interface Zend_Application_Bootstrap_ResourceBootstrapper
  215. {
  216. public function registerPluginResource($resource, $options = null);
  217. public function unregisterPluginResource($resource);
  218. public function hasPluginResource($resource);
  219. public function getPluginResource($resource);
  220. public function getPluginResources();
  221. public function getPluginResourceNames();
  222. public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader);
  223. public function getPluginLoader();
  224. }
  225. ]]></programlisting>
  226. <para>
  227. Ressource-Plugins bieten grundsätzlich die Fähigkeit, Ressource-Initialisierer zu
  228. erstellen, die zwischen Anwendungen wiederverwendet werden können. Das erlaubt es,
  229. die aktuelle Bootstrap relativ klein zu halten, und neue Ressourcen einzuführen
  230. ohne sie in der Bootstrap selbst anzugreifen.
  231. </para>
  232. <para>
  233. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname> (und bei
  234. Erweiterung <classname>Zend_Application_Bootstrap_Bootstrap</classname>)
  235. implementiert dieses Interface genauso, und erlaubt es Ressource-Plugins zu
  236. verwenden.
  237. </para>
  238. <para>
  239. Um Ressource-Plugins zu verwenden, müssen diese in den Optionen spezifiziert
  240. werden, die dem Anwendungsobjekt und/oder der Bootstrap übergeben werden. Diese
  241. Optionen können von einer Konfigurationsdatei kommen, oder manuell übergeben
  242. werden. Optionen sind Paare von Schlüssel zu Optionen, wobei der Schlüssel
  243. den Namen der Ressource repräsentiert. Der Ressourcename ist das Segment, das
  244. dem Klassenpräfix folgt. Die Ressourcen, die zum Beispiel mit Zend Framework
  245. ausgeliefert werden, haben das Klassenpräfix
  246. "<classname>Zend_Application_Resource_</classname>"; alles was folgt würde der
  247. Name der Ressource sein. Als Beispiel:
  248. </para>
  249. <programlisting language="php"><![CDATA[
  250. $application = new Zend_Application(APPLICATION_ENV, array(
  251. 'resources' => array(
  252. 'FrontController' => array(
  253. 'controllerDirectory' => APPLICATION_PATH . '/controllers',
  254. ),
  255. ),
  256. ));
  257. ]]></programlisting>
  258. <para>
  259. Das bedeutet, dass die Ressource "FrontController" verwendet werden sollte, mit den
  260. spezifizierten Optionen.
  261. </para>
  262. <para>
  263. Wenn man beginnt, eigene Ressource-Plugins zu schreiben, oder Ressource-Plugins von
  264. dritten anzupassen, muß man der eigenen Bootstrap mitteilen, wo nach ihnen zu suchen
  265. ist. Intern verwendet Bootstrap <classname>Zend_Loader_PluginLoader</classname>,
  266. so dass man nur die üblichen Klassenpräfix und Pfadpaare angeben muß.
  267. </para>
  268. <para>
  269. Als Beispiel nehmen wir an, dass wir eigene Ressource-Plugins in
  270. <filename>APPLICATION_PATH/resources/</filename> haben, und dass sie das gemeinsame
  271. Klassenpräfix <classname>My_Resource</classname> teilen. Man würde diese
  272. Information dem Anwendungsobjekt wie folgt übergeben:
  273. </para>
  274. <programlisting language="php"><![CDATA[
  275. $application = new Zend_Application(APPLICATION_ENV, array(
  276. 'pluginPaths' => array(
  277. 'My_Resource' => APPLICATION_PATH . '/resources/',
  278. ),
  279. 'resources' => array(
  280. 'FrontController' => array(
  281. 'controllerDirectory' => APPLICATION_PATH . '/controllers',
  282. ),
  283. ),
  284. ));
  285. ]]></programlisting>
  286. <para>
  287. Man ist jetzt in der Lage, Ressourcen aus diesem Verzeichnis zu verwenden.
  288. </para>
  289. <para>
  290. Wie Ressource-Methoden kann die Methode <methodname>bootstrap()</methodname>
  291. verwendet werden, um Ressource-Plugins zu verwenden. Wie bei Ressource-Methoden
  292. kann man entweder einzelne Ressource-Plugins spezifizieren, mehrere Plugins
  293. (über ein Array), oder alle Plugins. Zusätzlich kann man mischen und entsprechende
  294. Ressource-Methoden genauso ausführen.
  295. </para>
  296. <programlisting language="php"><![CDATA[
  297. // Eine ausführen:
  298. $bootstrap->bootstrap('FrontController');
  299. // Mehrere ausführen:
  300. $bootstrap->bootstrap(array('FrontController', 'Foo'));
  301. // Alle Ressource Methoden und Plugins ausführen:
  302. $bootstrap->bootstrap();
  303. ]]></programlisting>
  304. </sect3>
  305. <sect3 id="zend.application.theory-of-operation.bootstrap.registry">
  306. <title>Ressource Registry</title>
  307. <para>
  308. Viele, wenn nicht sogar alle, der eigenen Ressource-Methoden oder -Plugins
  309. initialisieren Objekte, und in vielen Fällen werden diese Objekte an anderen
  310. Orten der Anwendung benötigt. Wie kann man auf sie zugreifen?
  311. </para>
  312. <para>
  313. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
  314. bietet eine lokale Registry für diese Objekte. Um eigene Objekte darin zu
  315. speichern, müssen diese einfach von den eigenen Ressourcen zurückgegeben werden.
  316. </para>
  317. <para>
  318. Für maximale Flexibilität wird diese Registry intern als "Container" bezeichnet;
  319. die einzige Voraussetzung ist, dass es ein Objekt ist. Ressourcen werden dann als
  320. Eigenschaften registriert, die nach dem Namen der Ressource benannt sind.
  321. Standardmäßig wird eine Instanz von <classname>Zend_Registry</classname> verwendet,
  322. man kann aber jedes andere Objekt spezifizieren, wenn man das will. Die Methoden
  323. <methodname>setContainer()</methodname> und <methodname>getContainer()</methodname>
  324. können verwendet werden, um den Container selber zu manipulieren.
  325. <methodname>getResource($resource)</methodname> kann verwendet werden, um eine
  326. angegebene Ressource vom Container zu holen, und
  327. <methodname>hasResource($resource)</methodname> um zu prüfen, ob die Ressource
  328. aktuell schon registriert wurde.
  329. </para>
  330. <para>
  331. Als Beispiel nehmen wir eine grundlegenden View Ressource an:
  332. </para>
  333. <programlisting language="php"><![CDATA[
  334. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  335. {
  336. protected function _initView()
  337. {
  338. $view = new Zend_View();
  339. // weitere Initialisierungen...
  340. return $view;
  341. }
  342. }
  343. ]]></programlisting>
  344. <para>
  345. Man kann sie prüfen und/oder sie wie folgt holen:
  346. </para>
  347. <programlisting language="php"><![CDATA[
  348. // Verwendung der has- und getResource()-Paare:
  349. if ($bootstrap->hasResource('view')) {
  350. $view = $bootstrap->getResource('view');
  351. }
  352. // Über den Container:
  353. $container = $bootstrap->getContainer();
  354. if (isset($container->view)) {
  355. $view = $container->view;
  356. }
  357. ]]></programlisting>
  358. <para>
  359. Es ist zu beachten, dass die Registry und auch der Container nicht global sind. Das
  360. bedeutet, dass man auf die Bootstrap zugreifen muß, um Ressourcen zu holen.
  361. <classname>Zend_Application_Bootstrap_Bootstrap</classname> bietet einigen
  362. Komfort hierfür: während der Ausführung von
  363. <methodname>run()</methodname>, registriert sie sich als FrontController-Parameter
  364. "bootstrap", was es erlaubt, sie von Routern, Dispatchern, Plugins und
  365. Action-Controllern zu holen.
  366. </para>
  367. <para>
  368. Wenn man zum Beispiel auf die View Ressource von oben im eigenen Action
  369. Controller zugreifen will, kann man das wie folgt tun:
  370. </para>
  371. <programlisting language="php"><![CDATA[
  372. class FooController extends Zend_Controller_Action
  373. {
  374. public function init()
  375. {
  376. $bootstrap = $this->getInvokeArg('bootstrap');
  377. $view = $bootstrap->getResource('view');
  378. // ...
  379. }
  380. }
  381. ]]></programlisting>
  382. </sect3>
  383. <sect3 id="zend.application.theory-of-operation.bootstrap.dependency-tracking">
  384. <title>Erkennen von Abhängigkeiten</title>
  385. <para>
  386. Zusätzlich zur Ausführung von Ressource-Methoden und -Plugins, ist es notwendig
  387. sicherzustellen, dass diese einmal und wirklich nur einmal ausgeführt werden; sie
  388. sollen eine Anwendung bootstrappen, und die mehrfache Ausführung von ihnen kann
  389. zu einem Overhead von Ressourcen führen.
  390. </para>
  391. <para>
  392. Zur gleichen Zeit können Ressourcen von anderen ausgeführten Ressourcen abhängen.
  393. Um diese zwei Fälle zu lösen bietet
  394. <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname> einen einfachen
  395. und effektiven Mechanismus für die Erkennung von Abhängigkeiten.
  396. </para>
  397. <para>
  398. Wie vorher erwähnt werden alle Ressourcen -- ob Methoden oder Plugins -- durch den
  399. Aufruf von <methodname>bootstrap($resource)</methodname> gebootstrappt, wobei
  400. <varname>$resource</varname> der Name einer Ressource ist, ein Array von Ressourcen
  401. oder leer gelassen wird, was zeigt, dass alle Ressourcen ausgeführt werden sollen.
  402. </para>
  403. <para>
  404. Wenn eine Ressource von anderen Ressourcen abhängig ist, sollten Sie in Ihrem Code
  405. <methodname>bootstrap()</methodname> aufrufen um sicherzustellen, dass die Ressource
  406. ausgeführt wurde. Weitere Aufrufe von ihr werden dann ignoriert.
  407. </para>
  408. <para>
  409. In einer Ressource-Methode würde so ein Aufruf wie folgt aussehen:
  410. </para>
  411. <programlisting language="php"><![CDATA[
  412. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  413. {
  414. protected function _initRequest()
  415. {
  416. // Sicherstellen, dass der FrontController initialisiert wird
  417. $this->bootstrap('FrontController');
  418. // Den FrontController von der Bootstrap Registry erhalten
  419. $front = $this->getResource('FrontController');
  420. $request = new Zend_Controller_Request_Http();
  421. $request->setBaseUrl('/foo');
  422. $front->setRequest($request);
  423. // Sicherstellen, dass die Anfrage in der Bootstrap Registry
  424. // gespeichert ist
  425. return $request;
  426. }
  427. }
  428. ]]></programlisting>
  429. </sect3>
  430. </sect2>
  431. <sect2 id="zend.application.theory-of-operation.resources">
  432. <title>Ressource Plugins</title>
  433. <para>
  434. <link linkend="zend.application.theory-of-operation.bootstrap.resource-plugins">Wie
  435. vorher erwähnt</link> ist die Verwendung von Ressource Plugins ein guter Weg, um
  436. wiederverwendbare Bootstrap-Ressourcen zu erstellen und um so viel eigenen Code wie
  437. möglich in diskrete Klassen auszulagern. Wärend Zend Framework mit einer Anzahl
  438. von standardmäßigen Ressource-Plugins geliefert wird, besteht das Ziel darin, dass der
  439. Entwickler eigene schreiben sollte, um seine eigenen Notwendigkeiten der
  440. Initialisierung zu kapseln.
  441. </para>
  442. <para>
  443. Ressource-Plugins müssen nur <classname>Zend_Application_Resource_Resource</classname>
  444. implementieren, oder einfach
  445. <classname>Zend_Application_Resource_ResourceAbstract</classname> erweitern. Das
  446. grundsätzliche Interface ist folgendes:
  447. </para>
  448. <programlisting language="php"><![CDATA[
  449. interface Zend_Application_Resource_Resource
  450. {
  451. public function __construct($options = null);
  452. public function setBootstrap(
  453. Zend_Application_Bootstrap_Bootstrapper $bootstrap
  454. );
  455. public function getBootstrap();
  456. public function setOptions(array $options);
  457. public function getOptions();
  458. public function init();
  459. }
  460. ]]></programlisting>
  461. <para>
  462. Das Interface definiert einfach, was ein Ressouce-Plugin an Optionen im Konstruktor
  463. akzeptieren sollte, die Mechanismen für das Setzen und Zurückgeben von Optionen,
  464. die Mechanismen für das Setzen und Zurückgeben des Bootstrap-Objekts und eine
  465. Initialisierungs-Methode.
  466. </para>
  467. <para>
  468. Als Beispiel nehmen wir an, dass wir eine normale View Initialisierung haben, die in der
  469. eigenen Anwendung verwendet wird. Man hat normale Doctype, <acronym>CSS</acronym> und
  470. Javascript, und will in der Lage sein, diese in einem Standard-Dokumententitel über die
  471. Konfiguration zu übergeben. So ein Ressource-Plugin könnte wie folgt aussehen:
  472. </para>
  473. <programlisting language="php"><![CDATA[
  474. class My_Resource_View extends Zend_Application_Resource_ResourceAbstract
  475. {
  476. protected $_view;
  477. public function init()
  478. {
  479. // Die View zurückgeben damit die Bootstrap sie
  480. // in der Registry speichert
  481. return $this->getView();
  482. }
  483. public function getView()
  484. {
  485. if (null === $this->_view) {
  486. $options = $this->getOptions();
  487. $title = '';
  488. if (array_key_exists('title', $options)) {
  489. $title = $options['title'];
  490. unset($options['title']);
  491. }
  492. $view = new Zend_View($options);
  493. $view->doctype('XHTML1_STRICT');
  494. $view->headTitle($title);
  495. $view->headLink()->appendStylesheet('/css/site.css');
  496. $view->headScript()->appendfile('/js/analytics.js');
  497. $viewRenderer =
  498. Zend_Controller_Action_HelperBroker::getStaticHelper(
  499. 'ViewRenderer'
  500. );
  501. $viewRenderer->setView($view);
  502. $this->_view = $view;
  503. }
  504. return $this->_view;
  505. }
  506. }
  507. ]]></programlisting>
  508. <para>
  509. Solange man den Präfix-Pfad für dieses Ressource-Plugin registriert, kann es in der
  510. eigenen Anwendung verwendet werden. Weil der Plugin-Loader verwendet wird, ist es
  511. besser, das gelieferte "View"-Ressource-Plugin zu überschreiben und sicherzustellen,
  512. dass man stattdessen das eigene verwendet.
  513. </para>
  514. </sect2>
  515. </sect1>