| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 22741 -->
- <!-- Reviewed: 22741 -->
- <sect1 id="zend.application.examples">
- <title>Beispiele</title>
- <para>
- Die Klasse Bootstrap selbst wird typischerweise sehr minimal sein; oft
- wird sie einfach
- nur ein leerer Stub sein, der die Basis Bootstrapping-Klasse erweitert:
- </para>
- <programlisting language="php"><![CDATA[
- class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
- {
- }
- ]]></programlisting>
- <para>
- Mit einer entsprechenden Konfigurationsdatei:
- </para>
- <programlisting language="ini"><![CDATA[
- ; APPLICATION_PATH/configs/application.ini
- [production]
- autoloaderNamespaces[] = "My_"
- bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
- bootstrap.class = "Bootstrap"
- pluginpaths.My_Bootstrap_Resource = "My/Bootstrap/Resource"
- resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
- [testing: production]
- [development : production]
- ]]></programlisting>
- <note>
- <title>Namespaces für Autoloader</title>
- <para>
- Weil diese Beispiele eigenen Code verwenden, müssen wir die Präfixe
- der Namespaces
- für diesen Code in unserer Konfiguration registrieren; dies wird mit dem
- Konfigurationsschlüssel
- <property>autoloaderNamespaces</property>
- getan, welcher ein
- Array ist.
- </para>
- <para>
- Um zusätzlich sicherzustellen, dass eigene Plugin-Ressourcen erkannt
- werden, müssen wir
- einen Plugin-Präfixpfad in der Bootstrap registrieren. Das wird mit dem
- Konfigurationsschlüssel
- <property>pluginpaths</property>
- getan, welcher ein assoziatives
- Array ist, mit Schlüsseln, die das zu verwendenden Präfix kennzeichnen,
- und Werten,
- welche den Pfad enthalten, der diesem Präfix entspricht.
- </para>
- </note>
- <para>
- Sollten trotzdem eigene Initialisierungen notwendig sein, hat man zwei
- Möglichkeiten.
- Erstens kann man Methoden schreiben, die mit
- <emphasis>_init</emphasis>
- anfangen, um eigenen
- Code zu spezifizieren, der für das Bootstrapping verwendet werden soll.
- Diese Methoden
- werden durch
- <methodname>bootstrap()</methodname>
- aufgerufen, und können genauso aufgerufen
- werden, wie wenn sie öffentliche Methoden wären:
- <emphasis>bootstrap<resource>()</emphasis>
- . Sie sollten ein optionales Array an
- Optionen akzeptieren.
- </para>
- <para>
- Wenn die eigene Ressource-Methode einen Wert zurückgibt, wird diese in
- einem Container
- im Bootstrap gespeichert. Das kann nützlich sein, wenn verschiedene
- Ressourcen interagieren
- müssen (wie wenn eine Ressource sich selbst in eine andere iniziiert). Die
- Methode
- <methodname>getResource()</methodname>
- kann dann verwendet werden, um diese Werte zu
- erhalten.
- </para>
- <para>
- Das Beispiel unten zeigt eine Ressource-Methode für die Initialisierung
- des Anfrage-Objekts.
- Es verwendet die Erkennung der Abhängigkeit (diese hängt von der
- Ressource FrontController
- ab), holt eine Ressource vom Bootstrap, und gibt einen Wert zurück, um ihn
- im
- Bootstrap zu speichern.
- </para>
- <programlisting language="php"><![CDATA[
- class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
- {
- protected function _initRequest()
- {
- // Sicherstellen, dass eine FrontController-Instanz vorhanden ist
- // und diese holen
- $this->bootstrap('FrontController');
- $front = $this->getResource('FrontController');
- // Das Anfrage-Objekt initialisieren
- $request = new Zend_Controller_Request_Http();
- $request->setBaseUrl('/foo');
- // Sie dem FrontController hinzufügen
- $front->setRequest($request);
- // Bootstrap speichert den Wert im 'request' Schlüssel
- // seines Containers
- return $request;
- }
- }
- ]]></programlisting>
- <para>
- Man beachte in diesem Beispiel den Aufruf von
- <methodname>bootstrap()</methodname>
- ; dieser
- stellt sicher, dass der FrontController initialisiert wurde, bevor die
- Methode aufgerufen
- wird. Dieser Aufruf kann entweder eine Ressource oder eine andere Methode
- in der Klasse
- auslösen.
- </para>
- <para>
- Die andere Option ist, die Verwendung eines Ressource-Plugins.
- Ressource-Plugins sind
- Objekte, die spezielle Initialisierungen ausführen, und die wie folgt
- spezifiziert werden
- können:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Während der Instanzierung des Objekts
- <classname>Zend_Application</classname>
- </para>
- </listitem>
- <listitem>
- <para>
- Während der Initialisierung des Objekts Bootstrap
- </para>
- </listitem>
- <listitem>
- <para>
- Durch explizites Einschalten über Methodenaufrufe auf dem Objekt
- Bootstrap
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Ressource-Plugins implementieren
- <classname>Zend_Application_Resource_ResourceAbstract</classname>
- , welche einfach
- definieren, dass sie Injektion des Aufrufers und von Optionen erlauben, und die
- eine
- <methodname>init()</methodname>
- Methode haben. Als Beispiel, könnte eine eigene
- "View"-Bootstrap-Ressource wie folgt aussehen:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Bootstrap_Resource_View
- extends Zend_Application_Resource_ResourceAbstract
- {
- public function init()
- {
- $view = new Zend_View($this->_getOptions());
- Zend_Dojo::enableView($view);
- $view->doctype('XHTML1_STRICT');
- $view->headTitle()->setSeparator(' - ')->append('Meine Site');
- $view->headMeta()->appendHttpEquiv('Content-Type',
- 'text/html; charset=utf-8');
- $view->dojo()->setDjConfigOption('parseOnLoad', true)
- ->setLocalPath('/js/dojo/dojo.js')
- ->registerModulePath('../spindle', 'spindle')
- ->addStylesheetModule('spindle.themes.spindle')
- ->requireModule('spindle.main')
- ->disable();
- $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
- 'ViewRenderer'
- );
- $viewRenderer->setView($view);
- return $view;
- }
- }
- ]]></programlisting>
- <para>
- Um der Bootstrap zu sagen, dass sie das verwenden soll, würde man
- entweder den Klassennamen
- des Ressource-Plugins übergeben müssen, oder eine Kombination eines
- Plugin Loader
- Präfixpfades und den Kurznamen des Ressource-Plugins (z.B. "view"):
- </para>
- <programlisting language="php"><![CDATA[
- $application = new Zend_Application(
- APPLICATION_ENV,
- array(
- 'resources' => array(
- 'My_Bootstrap_Resource_View' => array(), // kompletter Klassenname
- 'view', // ODER Kurzname
- 'FrontController' => array(
- 'controllerDirectory' => APPLICATION_PATH . '/controllers',
- ),
- ),
- // Für Kurznamen, definiere die Plugin Pfade:
- 'pluginPaths = array(
- 'My_Bootstrap_Resource' => 'My/Bootstrap/Resource',
- )
- )
- );
- ]]></programlisting>
- <para>
- Ressource-Plugins können andere Ressourcen und Initialisierungen aufrufen, indem sie
- auf den
- Eltern-Bootstrap zugreifen:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Bootstrap_Resource_Layout
- extends Zend_Application_Resource_ResourceAbstract
- {
- public function init()
- {
- // Sicherstellen, dass die View initialisiert ist...
- $this->getBootstrap()->bootstrap('view');
- // Das View-Objekt erhalten
- $view = $this->getBootstrap()->getResource('view');
- // ...
- }
- }
- ]]></programlisting>
- <para>
- Bei normaler Verwendung würde man die Anwendung instanzieren, sie
- bootstrappen, und
- anschließend ausführen:
- </para>
- <programlisting language="php"><![CDATA[
- $application = new Zend_Application(...);
- $application->bootstrap()
- ->run();
- ]]></programlisting>
- <para>
- Für ein eigenes Skript müsste man einfach spezifische Ressourcen
- initialisieren:
- </para>
- <programlisting language="php"><![CDATA[
- $application = new Zend_Application(...);
- $application->getBootstrap('db');
- $service = new Zend_XmlRpc_Server();
- $service->setClass('Foo'); // Verwende die Datenbank...
- echo $service->handle();
- ]]></programlisting>
- <para>
- Statt der Verwendung der Methode
- <methodname>bootstrap()</methodname>
- , um interne Methoden
- oder Ressourcen aufzurufen, kann man auch Überladung verwenden:
- </para>
- <programlisting language="php"><![CDATA[
- $application = new Zend_Application(...);
- $application->getBootstrapDb();
- ]]></programlisting>
- </sect1>
|