Zend_Application-TheoryOfOperation.xml 24 KB

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