| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.controller.quickstart">
- <title>Zend_Controller Schnellstart</title>
- <sect2 id="zend.controller.quickstart.introduction">
- <title>Einführung</title>
- <para>
- <classname>Zend_Controller</classname> ist das Herz des <acronym>MVC</acronym> Systems
- des Zend Frameworks. <acronym>MVC</acronym> bedeutet <ulink
- url="http://de.wikipedia.org/wiki/Model_View_Controller">Model-View-Controller</ulink>
- und ist ein Entwurfsmuster, das darauf abzielt, Anwendungslogik von Anzeigelogik zu
- trennen. <classname>Zend_Controller_Front</classname> implementiert ein <ulink
- url="http://www.martinfowler.com/eaaCatalog/frontController.html">Front-Controller</ulink>-Entwurfsmuster,
- das vorschreibt, dass alle Anfragen vom Front-Controller abgefangen und abhängig von der
- angeforderten <acronym>URL</acronym> an individuelle Action-Controller weitergeleitet
- werden.
- </para>
- <para>
- Das <classname>Zend_Controller</classname> System wurde im Sinne der
- Erweiterungsmöglichkeiten entwickelt, entweder durch Erstellen von Subklassen, welche
- die bestehenden Klassen erweitern, oder durch Erstellen neuer Klassen, welche die
- verschiedenen Interfaces und abstrakten Klassen implementieren, welche das Fundament der
- Controller Klassenfamilie bilden, oder durch das Schreiben von Plugins und Action
- Helper, um die Funktionalität des Systems zu erweitern oder zu verändern.
- </para>
- </sect2>
- <sect2 id="zend.controller.quickstart.go">
- <title>Schnelleinstieg</title>
- <para>
- Wer mehr und tiefergehende Informationen benötigt, sollte die folgenden Abschnitte
- lesen. Dieser Abschnitt zeigt, wie man auf dem schnellsten Weg ein System lauffähig
- bekommt.
- </para>
- <sect3 id="zend.controller.quickstart.go.directory">
- <title>Ordnerstruktur anlegen</title>
- <para>
- Der erste Schritt ist, die Ordnerstruktur für das Framework anzulegen.
- Typischerweise ist das die folgende:
- </para>
- <programlisting language="php"><![CDATA[
- application/
- controllers/
- IndexController.php
- models/
- views/
- scripts/
- index/
- index.phtml
- helpers/
- filters/
- html/
- .htaccess
- index.php
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.controller.quickstart.go.docroot">
- <title>Wurzelverzeichnis setzen</title>
- <para>
- Der Webserver ist so zu konfigurieren, dass das Wurzelverzeichnis (Document Root)
- des Webservers im <filename>html/</filename>-Verzeichnis der obigen Ordnerstruktur
- liegt.
- </para>
- </sect3>
- <sect3 id="zend.controller.quickstart.go.rewrite">
- <title>Rewrite-Regeln erstellen</title>
- <para>
- In die Datei <filename>html/.htaccess</filename> aus der Struktur von oben gehört
- der folgende Code:
- </para>
- <programlisting language="php"><![CDATA[
- RewriteEngine On
- RewriteCond %{REQUEST_FILENAME} -s [OR]
- RewriteCond %{REQUEST_FILENAME} -l [OR]
- RewriteCond %{REQUEST_FILENAME} -d
- RewriteRule ^.*$ - [NC,L]
- RewriteRule ^.*$ index.php [NC,L]
- ]]></programlisting>
- <note>
- <title>Über mod_rewrite lernen</title>
- <para>
- Die obigen Rewrite Regeln erlauben es auf jede Datei im Document Root des
- eigenen virtuellen Host's zuzugreifen. Wenn es Dateien gibt die man auf diesem
- Weg nicht bereitstellen will, muss man in seinen Regeln restriktiver sein. Gehe
- zur Apache WebSite und <ulink
- url="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">lerne mehr über
- mod_rewrite</ulink>.
- </para>
- </note>
- <para>
- Wenn man <acronym>IIS</acronym> 7.0 verwendet, sollte man die folgende Rewrite
- Konfiguration verwenden:
- </para>
- <programlisting language="xml"><![CDATA[
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <system.webServer>
- <rewrite>
- <rules>
- <rule name="Imported Rule 1" stopProcessing="true">
- <match url="^.*$" />
- <conditions logicalGrouping="MatchAny">
- <add input="{REQUEST_FILENAME}"
- matchType="IsFile" pattern=""
- ignoreCase="false" />
- <add input="{REQUEST_FILENAME}"
- matchType="IsDirectory"
- pattern="" ignoreCase="false" />
- </conditions>
- <action type="None" />
- </rule>
- <rule name="Imported Rule 2" stopProcessing="true">
- <match url="^.*$" />
- <action type="Rewrite" url="index.php" />
- </rule>
- </rules>
- </rewrite>
- </system.webServer>
- </configuration>
- ]]></programlisting>
- <para>
- Die obige Regel routet Anfragen entsprechend auf existierende Ressourcen
- (existierende Symlinks, nicht-leere Dateien, oder nicht-leere Verzeichnisse),
- und alle anderen Anfragen an den Front Controller.
- </para>
- <note>
- <para>
- Die Rewrite-Regel oben ist für den Apache-Webserver; Beispiele für andere
- Webserver finden sich in der <link
- linkend="zend.controller.router.introduction">Router-Dokumentation</link>.
- </para>
- </note>
- </sect3>
- <sect3 id="zend.controller.quickstart.go.bootstrap">
- <title>Boostrap-Datei erstellen</title>
- <para>
- Die Bootstrap-Datei ist die Datei, durch die alle Anfragen geleitet werden
- -- <filename>html/index.php</filename> in unserem Fall. In die Datei
- <filename>html/index.php</filename> gehört der folgende Code:
- </para>
- <programlisting language="php"><![CDATA[
- Zend_Controller_Front::run('/path/to/app/controllers');
- ]]></programlisting>
- <para>
- Das instanziert und führt den Front-Controller aus,
- der Anfragen an den Action-Controller weitergibt.
- </para>
- </sect3>
- <sect3 id="zend.controller.quickstart.go.controller">
- <title>Den Action-Controller für die Startseite erstellen</title>
- <para>
- Bevor wir von Action-Controllern reden, sollte erst verstanden werden, wie Anfragen
- im Zend Framework behandelt werden. Standardmäßig zeigt das erste Segment eines
- <acronym>URL</acronym> auf einen Controller und das zweite Segment auf eine Aktion,
- welche dieser Controller ausführen soll. Als Beispiel sei der <acronym>URL</acronym>
- <filename>http://framework.zend.com/roadmap/components</filename> gegeben. Der Pfad
- ist <filename>/roadmap/components</filename>, was die Anfrage zum Controller
- <emphasis>roadmap</emphasis> und dort in die Aktion <emphasis>components</emphasis>
- leitet. Wenn keine Aktion angegeben wird, wird <emphasis>index</emphasis> als
- Standard-Aktion angenommen, und wenn kein Controller angegeben wird, wird auch
- <emphasis>index</emphasis> als Standard-Controller angenommen. (Das folgt der
- Apache-Konvention, die einen <emphasis>DirectoryIndex</emphasis> automatisch
- findet).
- </para>
- <para>
- Der Dispatcher von <classname>Zend_Controller</classname> nimmt dann den Wert, der
- als Controller angegeben ist, und schließt daraus auf eine passende Klasse. In der
- normalen Einstellung des Dispatchers wird der erste Buchstabe jedes Wortes im
- Controller-Namen groß geschrieben (Title-case), und dann das Wort
- <emphasis>Controller</emphasis> angehängt. Das bedeutet für unser Beispiel, dass
- die Anfrage nach dem Controller <emphasis>roadmap</emphasis> an die Klasse
- <classname>RoadmapController</classname> weitergeleitet wird.
- </para>
- <para>
- Auf ähnliche Art wird die Methode für die Aktion bestimmt, die der Controller
- ausführen soll. In der Grundeinstellung wird die angefragte Aktion komplett
- kleingeschrieben und das Wort <emphasis>Action</emphasis> wird angehängt. In
- unserem Beispiel wird also die Aktion <emphasis>components</emphasis> zu
- <methodname>componentsAction()</methodname>, insgesamt wird also die Methode
- <methodname>RoadmapController::componentsAction()</methodname> aufgerufen.
- </para>
- <para>
- Also, weiter gehts. Jetzt wird ein Startseiten-Controller und eine dazugehörige
- Standard-Aktionsmethode erstellt. Wie vorhin bereits erwähnt, heißen
- Standard-Controller und -Aktion beide <emphasis>index</emphasis>. Also gehört in
- die Datei <filename>application/controllers/IndexController.php</filename>
- folgendes:
- </para>
- <programlisting language="php"><![CDATA[
- /** Zend_Controller_Action */
- class IndexController extends Zend_Controller_Action
- {
- public function indexAction()
- {
- }
- }
- ]]></programlisting>
- <para>
- Normalerweise ist ein Action-Helper namens <link
- linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
- eingeschaltet. Das bedeutet, dass sofort, wenn eine leere Aktionsmethode und ein
- passendes View-Script existieren, Inhalte gerendert werden. Standardmäßig wird die
- Klasse <classname>Zend_View</classname> als View-Schicht im Zend-Framework
- <acronym>MVC</acronym> verwendet. Der <emphasis>ViewRenderer</emphasis> zaubert ein
- wenig, und benutzt Controller- (hier: <emphasis>index</emphasis>) und Aktionsname
- (hier: <emphasis>index</emphasis>), um herauszufinden, welches Template er rendern
- soll. Ohne dass man dies ändert, haben Templates die Dateiendung
- <filename>.phtml</filename>, das heißt also für unser Beispiel, dass das Template
- <filename>index/index.phtml</filename> gerendert wird. Zusätzlich nimmt der
- <emphasis>ViewRenderer</emphasis> automatisch an, dass das Verzeichnis
- <filename>views/</filename> auf der selben Ebene wie das Controller Verzeichnis das
- View-Basisverzeichnis ist, und dass die eigentlichen View-Scripts in dessen
- Unterverzeichnis <filename>views/scripts/</filename> liegen. Insgesamt hat also das
- Template, das gerendert wird, den Pfad
- <filename>application/views/scripts/index/index.phtml</filename>.
- </para>
- </sect3>
- <sect3 id="zend.controller.quickstart.go.view">
- <title>Das View-Script erstellen</title>
- <para>
- Wie <link linkend="zend.controller.quickstart.go.controller">oben
- beschrieben</link>, werden View-Scripts im Verzeichnis
- <filename>application/views/scripts/</filename> abgelegt; das View-Script für den
- Starseiten-Controller und dessen Standard-Aktion hat den Pfad
- <filename>application/views/scripts/index/index.phtml</filename>. Da hinein kommt
- das folgende <acronym>HTML</acronym>:
- </para>
- <programlisting language="php"><![CDATA[
- <!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Meine erste Zend Framework-Seite</title>
- </head>
- <body>
- <h1>Hallo Welt!</h1>
- </body>
- </html>
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.controller.quickstart.go.errorhandler">
- <title>Fehler-Controller erstellen</title>
- <para>
- Standardmäßig ist <link
- linkend="zend.controller.plugins.standard.errorhandler">das
- Error-Handler-Plugin</link> registriert. Dieses Plugin erwartet, dass ein Controller
- existiert, der Fehler behandelt. Ohne weitere Einstellungen erwartet es einen
- <emphasis>ErrorController</emphasis> im Default-Modul mit einer Methode namens
- <methodname>errorAction()</methodname>:
- </para>
- <programlisting language="php"><![CDATA[
- /** Zend_Controller_Action */
- class ErrorController extends Zend_Controller_Action
- {
- public function errorAction()
- {
- }
- }
- ]]></programlisting>
- <para>
- In der bereits angesprochenen Ordnerstruktur gehört dieser Code in die Datei
- <filename>application/controllers/ErrorController.php</filename>. Außerdem muss
- auch ein View-Script
- <filename>application/views/scripts/error/error.phtml</filename> erstellt
- werden; Beispielhaft könnte sein Inhalt so aussehen:
- </para>
- <programlisting language="php"><![CDATA[
- <!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Fehler</title>
- </head>
- <body>
- <h1>Ein Fehler ist aufgetreten</h1>
- <p>Ein Fehler ist aufgetreten;
- bitte versuchen Sie es später noch einmal.</p>
- </body>
- </html>
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.controller.quickstart.go.finish">
- <title>Die Seite ansehen!</title>
- <para>
- Jetzt, wo der erste Controller und das erste View-Script geschrieben sind, kann der
- Browser aufgerufen und die Seite angesehen werden. Wäre
- <filename>example.com</filename> die Domain der Zend Framework-Installation, dann
- würde jeder der folgenden <acronym>URL</acronym>s auf die Seite zeigen, die wir
- gerade erstellt haben:
- </para>
- <itemizedlist>
- <listitem><para><filename>http://example.com/</filename></para></listitem>
- <listitem><para><filename>http://example.com/index</filename></para></listitem>
- <listitem>
- <para><filename>http://example.com/index/index</filename></para>
- </listitem>
- </itemizedlist>
- <para>
- Herzlichen Glückwunsch, Sie sind jetzt bereit, weitere Controller und
- Aktionsmethoden zu erstellen und Ihrer Seite damit Leben einzuhauchen.
- </para>
- </sect3>
- </sect2>
- </sect1>
|