Zend_Controller-QuickStart.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.quickstart">
  5. <title>Zend_Controller Schnellstart</title>
  6. <sect2 id="zend.controller.quickstart.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. <classname>Zend_Controller</classname> ist das Herz des <acronym>MVC</acronym> Systems
  10. des Zend Frameworks. <acronym>MVC</acronym> bedeutet <ulink
  11. url="http://de.wikipedia.org/wiki/Model_View_Controller">Model-View-Controller</ulink>
  12. und ist ein Entwurfsmuster, das darauf abzielt, Anwendungslogik von Anzeigelogik zu
  13. trennen. <classname>Zend_Controller_Front</classname> implementiert ein <ulink
  14. url="http://www.martinfowler.com/eaaCatalog/frontController.html">Front-Controller</ulink>-Entwurfsmuster,
  15. das vorschreibt, dass alle Anfragen vom Front-Controller abgefangen und abhängig von der
  16. angeforderten <acronym>URL</acronym> an individuelle Action-Controller weitergeleitet
  17. werden.
  18. </para>
  19. <para>
  20. Das <classname>Zend_Controller</classname> System wurde im Sinne der
  21. Erweiterungsmöglichkeiten entwickelt, entweder durch Erstellen von Subklassen, welche
  22. die bestehenden Klassen erweitern, oder durch Erstellen neuer Klassen, welche die
  23. verschiedenen Interfaces und abstrakten Klassen implementieren, welche das Fundament der
  24. Controller Klassenfamilie bilden, oder durch das Schreiben von Plugins und Action
  25. Helper, um die Funktionalität des Systems zu erweitern oder zu verändern.
  26. </para>
  27. </sect2>
  28. <sect2 id="zend.controller.quickstart.go">
  29. <title>Schnelleinstieg</title>
  30. <para>
  31. Wer mehr und tiefergehende Informationen benötigt, sollte die folgenden Abschnitte
  32. lesen. Dieser Abschnitt zeigt, wie man auf dem schnellsten Weg ein System lauffähig
  33. bekommt.
  34. </para>
  35. <sect3 id="zend.controller.quickstart.go.directory">
  36. <title>Ordnerstruktur anlegen</title>
  37. <para>
  38. Der erste Schritt ist, die Ordnerstruktur für das Framework anzulegen.
  39. Typischerweise ist das die folgende:
  40. </para>
  41. <programlisting language="php"><![CDATA[
  42. application/
  43. controllers/
  44. IndexController.php
  45. models/
  46. views/
  47. scripts/
  48. index/
  49. index.phtml
  50. helpers/
  51. filters/
  52. html/
  53. .htaccess
  54. index.php
  55. ]]></programlisting>
  56. </sect3>
  57. <sect3 id="zend.controller.quickstart.go.docroot">
  58. <title>Wurzelverzeichnis setzen</title>
  59. <para>
  60. Der Webserver ist so zu konfigurieren, dass das Wurzelverzeichnis (Document Root)
  61. des Webservers im <filename>html/</filename>-Verzeichnis der obigen Ordnerstruktur
  62. liegt.
  63. </para>
  64. </sect3>
  65. <sect3 id="zend.controller.quickstart.go.rewrite">
  66. <title>Rewrite-Regeln erstellen</title>
  67. <para>
  68. In die Datei <filename>html/.htaccess</filename> aus der Struktur von oben gehört
  69. der folgende Code:
  70. </para>
  71. <programlisting language="php"><![CDATA[
  72. RewriteEngine On
  73. RewriteCond %{REQUEST_FILENAME} -s [OR]
  74. RewriteCond %{REQUEST_FILENAME} -l [OR]
  75. RewriteCond %{REQUEST_FILENAME} -d
  76. RewriteRule ^.*$ - [NC,L]
  77. RewriteRule ^.*$ index.php [NC,L]
  78. ]]></programlisting>
  79. <note>
  80. <title>Über mod_rewrite lernen</title>
  81. <para>
  82. Die obigen Rewrite Regeln erlauben es auf jede Datei im Document Root des
  83. eigenen virtuellen Host's zuzugreifen. Wenn es Dateien gibt die man auf diesem
  84. Weg nicht bereitstellen will, muss man in seinen Regeln restriktiver sein. Gehe
  85. zur Apache WebSite und <ulink
  86. url="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">lerne mehr über
  87. mod_rewrite</ulink>.
  88. </para>
  89. </note>
  90. <para>
  91. Wenn man <acronym>IIS</acronym> 7.0 verwendet, sollte man die folgende Rewrite
  92. Konfiguration verwenden:
  93. </para>
  94. <programlisting language="xml"><![CDATA[
  95. <?xml version="1.0" encoding="UTF-8"?>
  96. <configuration>
  97. <system.webServer>
  98. <rewrite>
  99. <rules>
  100. <rule name="Imported Rule 1" stopProcessing="true">
  101. <match url="^.*$" />
  102. <conditions logicalGrouping="MatchAny">
  103. <add input="{REQUEST_FILENAME}"
  104. matchType="IsFile" pattern=""
  105. ignoreCase="false" />
  106. <add input="{REQUEST_FILENAME}"
  107. matchType="IsDirectory"
  108. pattern="" ignoreCase="false" />
  109. </conditions>
  110. <action type="None" />
  111. </rule>
  112. <rule name="Imported Rule 2" stopProcessing="true">
  113. <match url="^.*$" />
  114. <action type="Rewrite" url="index.php" />
  115. </rule>
  116. </rules>
  117. </rewrite>
  118. </system.webServer>
  119. </configuration>
  120. ]]></programlisting>
  121. <para>
  122. Die obige Regel routet Anfragen entsprechend auf existierende Ressourcen
  123. (existierende Symlinks, nicht-leere Dateien, oder nicht-leere Verzeichnisse),
  124. und alle anderen Anfragen an den Front Controller.
  125. </para>
  126. <note>
  127. <para>
  128. Die Rewrite-Regel oben ist für den Apache-Webserver; Beispiele für andere
  129. Webserver finden sich in der <link
  130. linkend="zend.controller.router.introduction">Router-Dokumentation</link>.
  131. </para>
  132. </note>
  133. </sect3>
  134. <sect3 id="zend.controller.quickstart.go.bootstrap">
  135. <title>Boostrap-Datei erstellen</title>
  136. <para>
  137. Die Bootstrap-Datei ist die Datei, durch die alle Anfragen geleitet werden
  138. -- <filename>html/index.php</filename> in unserem Fall. In die Datei
  139. <filename>html/index.php</filename> gehört der folgende Code:
  140. </para>
  141. <programlisting language="php"><![CDATA[
  142. Zend_Controller_Front::run('/path/to/app/controllers');
  143. ]]></programlisting>
  144. <para>
  145. Das instanziert und führt den Front-Controller aus,
  146. der Anfragen an den Action-Controller weitergibt.
  147. </para>
  148. </sect3>
  149. <sect3 id="zend.controller.quickstart.go.controller">
  150. <title>Den Action-Controller für die Startseite erstellen</title>
  151. <para>
  152. Bevor wir von Action-Controllern reden, sollte erst verstanden werden, wie Anfragen
  153. im Zend Framework behandelt werden. Standardmäßig zeigt das erste Segment eines
  154. <acronym>URL</acronym> auf einen Controller und das zweite Segment auf eine Aktion,
  155. welche dieser Controller ausführen soll. Als Beispiel sei der <acronym>URL</acronym>
  156. <filename>http://framework.zend.com/roadmap/components</filename> gegeben. Der Pfad
  157. ist <filename>/roadmap/components</filename>, was die Anfrage zum Controller
  158. <emphasis>roadmap</emphasis> und dort in die Aktion <emphasis>components</emphasis>
  159. leitet. Wenn keine Aktion angegeben wird, wird <emphasis>index</emphasis> als
  160. Standard-Aktion angenommen, und wenn kein Controller angegeben wird, wird auch
  161. <emphasis>index</emphasis> als Standard-Controller angenommen. (Das folgt der
  162. Apache-Konvention, die einen <emphasis>DirectoryIndex</emphasis> automatisch
  163. findet).
  164. </para>
  165. <para>
  166. Der Dispatcher von <classname>Zend_Controller</classname> nimmt dann den Wert, der
  167. als Controller angegeben ist, und schließt daraus auf eine passende Klasse. In der
  168. normalen Einstellung des Dispatchers wird der erste Buchstabe jedes Wortes im
  169. Controller-Namen groß geschrieben (Title-case), und dann das Wort
  170. <emphasis>Controller</emphasis> angehängt. Das bedeutet für unser Beispiel, dass
  171. die Anfrage nach dem Controller <emphasis>roadmap</emphasis> an die Klasse
  172. <classname>RoadmapController</classname> weitergeleitet wird.
  173. </para>
  174. <para>
  175. Auf ähnliche Art wird die Methode für die Aktion bestimmt, die der Controller
  176. ausführen soll. In der Grundeinstellung wird die angefragte Aktion komplett
  177. kleingeschrieben und das Wort <emphasis>Action</emphasis> wird angehängt. In
  178. unserem Beispiel wird also die Aktion <emphasis>components</emphasis> zu
  179. <methodname>componentsAction()</methodname>, insgesamt wird also die Methode
  180. <methodname>RoadmapController::componentsAction()</methodname> aufgerufen.
  181. </para>
  182. <para>
  183. Also, weiter gehts. Jetzt wird ein Startseiten-Controller und eine dazugehörige
  184. Standard-Aktionsmethode erstellt. Wie vorhin bereits erwähnt, heißen
  185. Standard-Controller und -Aktion beide <emphasis>index</emphasis>. Also gehört in
  186. die Datei <filename>application/controllers/IndexController.php</filename>
  187. folgendes:
  188. </para>
  189. <programlisting language="php"><![CDATA[
  190. /** Zend_Controller_Action */
  191. class IndexController extends Zend_Controller_Action
  192. {
  193. public function indexAction()
  194. {
  195. }
  196. }
  197. ]]></programlisting>
  198. <para>
  199. Normalerweise ist ein Action-Helper namens <link
  200. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  201. eingeschaltet. Das bedeutet, dass sofort, wenn eine leere Aktionsmethode und ein
  202. passendes View-Script existieren, Inhalte gerendert werden. Standardmäßig wird die
  203. Klasse <classname>Zend_View</classname> als View-Schicht im Zend-Framework
  204. <acronym>MVC</acronym> verwendet. Der <emphasis>ViewRenderer</emphasis> zaubert ein
  205. wenig, und benutzt Controller- (hier: <emphasis>index</emphasis>) und Aktionsname
  206. (hier: <emphasis>index</emphasis>), um herauszufinden, welches Template er rendern
  207. soll. Ohne dass man dies ändert, haben Templates die Dateiendung
  208. <filename>.phtml</filename>, das heißt also für unser Beispiel, dass das Template
  209. <filename>index/index.phtml</filename> gerendert wird. Zusätzlich nimmt der
  210. <emphasis>ViewRenderer</emphasis> automatisch an, dass das Verzeichnis
  211. <filename>views/</filename> auf der selben Ebene wie das Controller Verzeichnis das
  212. View-Basisverzeichnis ist, und dass die eigentlichen View-Scripts in dessen
  213. Unterverzeichnis <filename>views/scripts/</filename> liegen. Insgesamt hat also das
  214. Template, das gerendert wird, den Pfad
  215. <filename>application/views/scripts/index/index.phtml</filename>.
  216. </para>
  217. </sect3>
  218. <sect3 id="zend.controller.quickstart.go.view">
  219. <title>Das View-Script erstellen</title>
  220. <para>
  221. Wie <link linkend="zend.controller.quickstart.go.controller">oben
  222. beschrieben</link>, werden View-Scripts im Verzeichnis
  223. <filename>application/views/scripts/</filename> abgelegt; das View-Script für den
  224. Starseiten-Controller und dessen Standard-Aktion hat den Pfad
  225. <filename>application/views/scripts/index/index.phtml</filename>. Da hinein kommt
  226. das folgende <acronym>HTML</acronym>:
  227. </para>
  228. <programlisting language="php"><![CDATA[
  229. <!DOCTYPE html
  230. PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  231. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  232. <html>
  233. <head>
  234. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  235. <title>Meine erste Zend Framework-Seite</title>
  236. </head>
  237. <body>
  238. <h1>Hallo Welt!</h1>
  239. </body>
  240. </html>
  241. ]]></programlisting>
  242. </sect3>
  243. <sect3 id="zend.controller.quickstart.go.errorhandler">
  244. <title>Fehler-Controller erstellen</title>
  245. <para>
  246. Standardmäßig ist <link
  247. linkend="zend.controller.plugins.standard.errorhandler">das
  248. Error-Handler-Plugin</link> registriert. Dieses Plugin erwartet, dass ein Controller
  249. existiert, der Fehler behandelt. Ohne weitere Einstellungen erwartet es einen
  250. <emphasis>ErrorController</emphasis> im Default-Modul mit einer Methode namens
  251. <methodname>errorAction()</methodname>:
  252. </para>
  253. <programlisting language="php"><![CDATA[
  254. /** Zend_Controller_Action */
  255. class ErrorController extends Zend_Controller_Action
  256. {
  257. public function errorAction()
  258. {
  259. }
  260. }
  261. ]]></programlisting>
  262. <para>
  263. In der bereits angesprochenen Ordnerstruktur gehört dieser Code in die Datei
  264. <filename>application/controllers/ErrorController.php</filename>. Außerdem muss
  265. auch ein View-Script
  266. <filename>application/views/scripts/error/error.phtml</filename> erstellt
  267. werden; Beispielhaft könnte sein Inhalt so aussehen:
  268. </para>
  269. <programlisting language="php"><![CDATA[
  270. <!DOCTYPE html
  271. PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  272. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  273. <html>
  274. <head>
  275. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  276. <title>Fehler</title>
  277. </head>
  278. <body>
  279. <h1>Ein Fehler ist aufgetreten</h1>
  280. <p>Ein Fehler ist aufgetreten;
  281. bitte versuchen Sie es später noch einmal.</p>
  282. </body>
  283. </html>
  284. ]]></programlisting>
  285. </sect3>
  286. <sect3 id="zend.controller.quickstart.go.finish">
  287. <title>Die Seite ansehen!</title>
  288. <para>
  289. Jetzt, wo der erste Controller und das erste View-Script geschrieben sind, kann der
  290. Browser aufgerufen und die Seite angesehen werden. Wäre
  291. <filename>example.com</filename> die Domain der Zend Framework-Installation, dann
  292. würde jeder der folgenden <acronym>URL</acronym>s auf die Seite zeigen, die wir
  293. gerade erstellt haben:
  294. </para>
  295. <itemizedlist>
  296. <listitem><para><filename>http://example.com/</filename></para></listitem>
  297. <listitem><para><filename>http://example.com/index</filename></para></listitem>
  298. <listitem>
  299. <para><filename>http://example.com/index/index</filename></para>
  300. </listitem>
  301. </itemizedlist>
  302. <para>
  303. Herzlichen Glückwunsch, Sie sind jetzt bereit, weitere Controller und
  304. Aktionsmethoden zu erstellen und Ihrer Seite damit Leben einzuhauchen.
  305. </para>
  306. </sect3>
  307. </sect2>
  308. </sect1>