Zend_Controller-QuickStart.xml 15 KB

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