Zend_Controller-Basics.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.basics">
  5. <title>Zend_Controller Grundlagen</title>
  6. <para>
  7. Das <classname>Zend_Controller</classname> System wurde leichtgewichtig, modular und erweiterbar
  8. aufgebaut. Das Design ist einfach, um den Benutzern viel Flexibilität und Freiheiten zu
  9. ermöglichen. Dennoch bietet es ausreichend Struktur, damit Systeme, die auf den
  10. <classname>Zend_Controller</classname> aufbauen, gemeinsame Konventionen befolgen und einen
  11. ähnlichen Code Aufbau verwenden.
  12. </para>
  13. <para>
  14. Das folgende Diagramm zeigt den Workflow und der folgende Texte beschreibt das
  15. Zusammenspiel im Detail:
  16. </para>
  17. <para>
  18. <inlinegraphic width="483" scale="100" align="center" valign="middle"
  19. fileref="figures/zend.controller.basics.png" format="PNG" />
  20. </para>
  21. <para>
  22. Der <classname>Zend_Controller</classname> Ablauf wurde mit Hilfe verschiedener Komponenten
  23. implementiert. Während es für die Benutzung des Systems nicht notwendig ist, den
  24. kompletten Unterbau all dieser Komponenten zu verstehen, ist es hilfreich, über den
  25. Ablauf ausreichend Kenntnisse zu haben.
  26. </para>
  27. <itemizedlist>
  28. <listitem>
  29. <para>
  30. <classname>Zend_Controller_Front</classname> steuert den gesamten Ablauf des
  31. <classname>Zend_Controller</classname> Systems. Es ist eine Interpretation des
  32. FrontController Entwurfsmusters. <classname>Zend_Controller_Front</classname>
  33. verarbeitet alle Anfragen, die der Server erhält, und ist letztendlich dafür
  34. verantwortlich, die Anfragen an die ActionController
  35. (<classname>Zend_Controller_Action</classname>) zu deligieren.
  36. </para>
  37. </listitem>
  38. <listitem>
  39. <para>
  40. <classname>Zend_Controller_Request_Abstract</classname> (oft als das <code>Request
  41. Objekt</code> bezeichnet) repräsentiert die Umgebung
  42. der Anfrage und stellt Methoden für das Setzen und Abfragen der Namen für
  43. Controller und Aktion sowie jeder Anfrageparameter bereit. Zusätzlich
  44. behält es die Übersicht darüber, ob die enthaltene Aktion von
  45. <classname>Zend_Controller_Dispatcher</classname> verarbeitet wurde oder nicht.
  46. Erweiterungen dieses abstrakten Request Objektes können verwendet werden,
  47. um die gesamte Anfrageumgebung zu kapseln und Routern zu erlauben,
  48. Informationen aus der Anfrageumgebung abzufragen, um die Namen für
  49. Controller und Aktion zu setzen..
  50. </para>
  51. <para>
  52. Standardmäßig wird <classname>Zend_Controller_Request_Http</classname> verwendet,
  53. welches den Zugriff auf die komplette HTTP Anfrageumgebung ermöglicht.
  54. </para>
  55. </listitem>
  56. <listitem>
  57. <para>
  58. <classname>Zend_Controller_Router_Interface</classname> wird verwendet, um Router zu
  59. definieren. Routing ist der Prozess, bei dem die Anfrageumgebung untersucht
  60. wird, um zu ermitteln, welcher Controller und welche Aktion dieses
  61. Controllers diese Anfrage verarbeiten soll. Dieser Controller, diese Aktion
  62. und optionale Parameter werden dann im Request Object gesetzt, das vom
  63. <classname>Zend_Controller_Dispatcher_Standard</classname> verarbeitet wird. Das
  64. Routing wird nur einmal ausgeführt: wenn die Anfrage erhalten wird und
  65. bevor der erste Controller aufgerufen wird.
  66. </para>
  67. <para>
  68. Der Standardrouter <classname>Zend_Controller_Router_Rewrite</classname> nimmt den
  69. URI Endpunkt entgegen, der in <classname>Zend_Controller_Request_Http</classname>
  70. angegeben ist, und zerlegt ihn in einen Controller, eine Aktion und die
  71. Parameter basierend auf den Pfadinformationen der URL. Zum Beispiel würde
  72. die URL <code>http://localhost/foo/bar/key/value</code> übersetzt, um den
  73. <code>foo</code> Controller und die <code>bar</code> Aktion zu verwenden und
  74. einen Parameter <code>key</code> mit dem Wert <code>value</code> anzugeben.
  75. </para>
  76. <para>
  77. <classname>Zend_Controller_Router_Rewrite</classname> kann auch für beliebige Pfade
  78. verwendet werden; man beachte <link
  79. linkend="zend.controller.router">die
  80. Rewrite Router Dokumentation</link> für weitere Informationen.
  81. </para>
  82. </listitem>
  83. <listitem>
  84. <para>
  85. <classname>Zend_Controller_Dispatcher_Interface</classname> wird verwendet, um
  86. Dispatcher zu definieren. Dispatching ist der Prozess, den Controller und
  87. die Aktion aus dem Request Objekt abzufragen und auf eine Controller Datei/
  88. Klasse und eine Aktionsmethode in dieser Controller Klasse zu abzubilden.
  89. Wenn der Controller oder die Aktion nicht existieren, ermittelt es den zu
  90. verarbeitenden Standard Controller und Aktion.
  91. </para>
  92. <para>
  93. Der aktuelle Dispatcher Prozess besteht aus dem Instanzieren der Controller
  94. Klasse und dem Aufrufen der Aktionsmethode in dieser Klasse. Anders als das
  95. Routing, welches immer nur einmal vorkommt, erfolgt das Dispatching in einer
  96. Schleife. Wenn der Verarbeitungsstatus des Request Objektes irgendwann zurück
  97. gesetzt wird, wird die Schleife wiederholt und die Aktion aufgerufen, die
  98. zu diesem Zeitpunkt im Request Objekt gesetzt ist. Das erste Mal, wenn ein
  99. Schleifendurchlauf mit gesetztem Verarbeitungsstatus (boolsches true) im
  100. Request Objekt beendet wird, wird der Prozess beendet.
  101. </para>
  102. <para>
  103. Der Standarddispatcher ist <classname>Zend_Controller_Dispatcher_Standard</classname>.
  104. Er definiert Controller als MixedCasedKlassen, die auf das Wort Controller
  105. enden, und Aktionsmethoden als camelCasedMethoden, die auf das Wort Action
  106. enden: <code>SomeFooController::barAction</code>. In diesem Fall wird auf
  107. den Controller über <code>somefoo</code> und auf die Aktion über
  108. <code>bar</code> zugegriffen.
  109. </para>
  110. <note>
  111. <title>Konventionen von Namens-Schreibweisen</title>
  112. <para>
  113. Da Menschen grundsätzlich inkonsistent sind im Behandeln und der Gründlichkeit beim
  114. Tippen von Links, normalisiert Zend Framework die Pfad Informationen zur
  115. Kleinschreibung. Das beeinflut natürlich wie Kontroller und Aktionen benannt werden
  116. ... oder wie auf diese in Links referiert werden kann.
  117. </para>
  118. <para>
  119. Wenn es gewünscht ist das die eigene Kontrollerklasse oder
  120. Aktionsmethodenname mehrfache MixedCasedWörter oder camelCasedWörter
  121. enthält, dann müssen diese zu getrennten Wörtern in der URL seperiert
  122. werden, entweder mit einem '-' oder '.' (das zu verwendende Zeichen kann
  123. konfiguriert werden).
  124. </para>
  125. <para>
  126. Als Beispiel, wenn man zur Aktion in <code>FooBarController::bazBatAction()</code>
  127. kommen will, muß zu Ihr mit der URL as <code>/foo-bar/baz-bat</code> oder
  128. <code>/foo.bar/baz.bat</code> referiert werden.
  129. </para>
  130. </note>
  131. </listitem>
  132. <listitem>
  133. <para>
  134. <classname>Zend_Controller_Action</classname> ist die elementare Controller
  135. Komponente. Jeder Controller ist eine einzelne Klasse, welche die
  136. <classname>Zend_Controller_Action</classname> Klasse erweitert und Methoden für die
  137. Aktionen enthält.
  138. </para>
  139. </listitem>
  140. <listitem>
  141. <para>
  142. <classname>Zend_Controller_Response_Abstract</classname> definiert eine grundlegende
  143. Response Klasse, um Antworten der Aktion aus den Controllern zu sammeln und
  144. zurück zu geben. Es sammelt sowohl Header als auch Inhalte.
  145. </para>
  146. <para>
  147. Die Standard Response Klasse ist <classname>Zend_Controller_Response_Http</classname>,
  148. welches in einer HTTP Umgebung verwendet werden kann.
  149. </para>
  150. </listitem>
  151. </itemizedlist>
  152. <para>
  153. Der Ablauf vom <classname>Zend_Controller</classname> ist relativ einfach. Eine Anfrage wird vom
  154. <classname>Zend_Controller_Front</classname> empfangen, der wiederum
  155. <classname>Zend_Controller_Router_Rewrite</classname> aufruft, um zu ermitteln, welcher Controller
  156. (und welche Aktion in dem Controller) ausgeführt werden soll.
  157. <classname>Zend_Controller_Router_Rewrite</classname> zerteilt die URI um den Namen des Controllers
  158. und der Aktion für den Request zu setzen. <classname>Zend_Controller_Front</classname> durchläuft
  159. dann eine Dispatcher Schleife. Er ruft <classname>Zend_Controller_Dispatcher_Standard</classname>
  160. auf und übergibt den Request, um den Controller und die Aktion auszuführen, die im Request
  161. spezifiziert wurden (oder verwendet die Standardwerte). Wenn der Controller fertig ist,
  162. wird die Kontrolle wieder an <classname>Zend_Controller_Front</classname> übergeben. Wenn der
  163. Controller durch das Zurücksetzen des Dispatch Status des Requests angezeigt hat, dass
  164. ein weiterer Controller ausgeführt werden soll, wird der Durchlauf fortgesetzt und ein
  165. weiterer Dispatcher Prozess wird durchlaufen. Andernfalls endet der Prozess.
  166. </para>
  167. </sect1>
  168. <!--
  169. vim:se ts=4 sw=4 et:
  170. -->