Zend_Controller-Basics.xml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  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
  8. erweiterbar aufgebaut. Das Design ist einfach, um den Benutzern viel Flexibilität und
  9. Freiheiten zu ermöglichen. Dennoch bietet es ausreichend Struktur, damit Systeme, die auf
  10. den <classname>Zend_Controller</classname> aufbauen, gemeinsame Konventionen befolgen und
  11. einen ä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
  41. <emphasis>Request Objekt</emphasis> 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>
  53. verwendet, welches den Zugriff auf die komplette <acronym>HTTP</acronym>
  54. Anfrageumgebung ermöglicht.
  55. </para>
  56. </listitem>
  57. <listitem>
  58. <para>
  59. <classname>Zend_Controller_Router_Interface</classname> wird verwendet, um
  60. Router zu definieren. Routing ist der Prozess, bei dem die Anfrageumgebung
  61. untersucht wird, um zu ermitteln, welcher Controller und welche Aktion dieses
  62. Controllers diese Anfrage verarbeiten soll. Dieser Controller, diese Aktion
  63. und optionale Parameter werden dann im Request Object gesetzt, das vom
  64. <classname>Zend_Controller_Dispatcher_Standard</classname> verarbeitet wird. Das
  65. Routing wird nur einmal ausgeführt: wenn die Anfrage erhalten wird und
  66. bevor der erste Controller aufgerufen wird.
  67. </para>
  68. <para>
  69. Der Standardrouter <classname>Zend_Controller_Router_Rewrite</classname> nimmt
  70. den <acronym>URI</acronym> Endpunkt entgegen, der in
  71. <classname>Zend_Controller_Request_Http</classname> angegeben ist, und zerlegt
  72. ihn in einen Controller, eine Aktion und die Parameter basierend auf den
  73. Pfadinformationen der <acronym>URL</acronym>. Zum Beispiel würde die
  74. <acronym>URL</acronym> <filename>http://localhost/foo/bar/key/value</filename>
  75. übersetzt, um den <emphasis>foo</emphasis> Controller und die
  76. <emphasis>bar</emphasis> Aktion zu verwenden und einen Parameter
  77. <emphasis>key</emphasis> mit dem Wert <emphasis>value</emphasis> anzugeben.
  78. </para>
  79. <para>
  80. <classname>Zend_Controller_Router_Rewrite</classname> kann auch für beliebige
  81. Pfade verwendet werden; man beachte <link linkend="zend.controller.router">die
  82. Rewrite Router Dokumentation</link> für weitere Informationen.
  83. </para>
  84. </listitem>
  85. <listitem>
  86. <para>
  87. <classname>Zend_Controller_Dispatcher_Interface</classname> wird verwendet, um
  88. Dispatcher zu definieren. Dispatching ist der Prozess, den Controller und
  89. die Aktion aus dem Request Objekt abzufragen und auf eine Controller Datei
  90. (oder Klasse) und eine Aktionsmethode in dieser Controller Klasse abzubilden.
  91. Wenn der Controller oder die Aktion nicht existieren, ermittelt es den zu
  92. verarbeitenden Standard Controller und Aktion.
  93. </para>
  94. <para>
  95. Der aktuelle Dispatcher Prozess besteht aus dem Instanzieren der Controller
  96. Klasse und dem Aufrufen der Aktionsmethode in dieser Klasse. Anders als das
  97. Routing, welches immer nur einmal vorkommt, erfolgt das Dispatching in einer
  98. Schleife. Wenn der Verarbeitungsstatus des Request Objektes irgendwann zurück
  99. gesetzt wird, wird die Schleife wiederholt und die Aktion aufgerufen, die
  100. zu diesem Zeitpunkt im Request Objekt gesetzt ist. Das erste Mal, wenn ein
  101. Schleifendurchlauf mit gesetztem Verarbeitungsstatus (<type>Boolean</type>
  102. <constant>TRUE</constant>) im Request Objekt beendet wird, wird der Prozess
  103. beendet.
  104. </para>
  105. <para>
  106. Der Standarddispatcher ist
  107. <classname>Zend_Controller_Dispatcher_Standard</classname>. Er definiert
  108. Controller als MixedCasedKlassen, die auf das Wort Controller enden, und
  109. Aktionsmethoden als camelCasedMethoden, die auf das Wort Action enden:
  110. <methodname>SomeFooController::barAction()</methodname>. In diesem Fall wird
  111. auf den Controller über <emphasis>foo</emphasis> und auf die Aktion über
  112. <emphasis>bar</emphasis> zugegriffen.
  113. </para>
  114. <note>
  115. <title>Konventionen von Namens-Schreibweisen</title>
  116. <para>
  117. Da Menschen grundsätzlich inkonsistent sind im Behandeln und der
  118. Gründlichkeit beim Tippen von Links, normalisiert Zend Framework die Pfad
  119. Informationen zur Kleinschreibung. Das beeinflut natürlich wie Controller
  120. und Aktionen benannt werden ... oder wie auf diese in Links referiert werden
  121. kann.
  122. </para>
  123. <para>
  124. Wenn es gewünscht ist das die eigene Controllerklasse oder
  125. Aktionsmethodenname mehrfache MixedCasedWörter oder camelCasedWörter
  126. enthält, dann müssen diese zu getrennten Wörtern in der URL seperiert
  127. werden, entweder mit einem '-' oder '.' (das zu verwendende Zeichen kann
  128. konfiguriert werden).
  129. </para>
  130. <para>
  131. Als Beispiel, wenn man zur Aktion in
  132. <methodname>FooBarController::bazBatAction()</methodname> kommen will, muß
  133. zu Ihr mit der URL as <filename>/foo-bar/baz-bat</filename> oder
  134. <filename>/foo.bar/baz.bat</filename> referiert werden.
  135. </para>
  136. </note>
  137. </listitem>
  138. <listitem>
  139. <para>
  140. <classname>Zend_Controller_Action</classname> ist die elementare Controller
  141. Komponente. Jeder Controller ist eine einzelne Klasse, welche die
  142. <classname>Zend_Controller_Action</classname> Klasse erweitert und Methoden für
  143. die Aktionen enthält.
  144. </para>
  145. </listitem>
  146. <listitem>
  147. <para>
  148. <classname>Zend_Controller_Response_Abstract</classname> definiert eine
  149. grundlegende Response Klasse, um Antworten der Aktion aus den Controllern zu
  150. sammeln und zurück zu geben. Es sammelt sowohl Header als auch Inhalte.
  151. </para>
  152. <para>
  153. Die Standard Response Klasse ist
  154. <classname>Zend_Controller_Response_Http</classname>, welches in einer
  155. <acronym>HTTP</acronym> Umgebung verwendet werden kann.
  156. </para>
  157. </listitem>
  158. </itemizedlist>
  159. <para>
  160. Der Ablauf vom <classname>Zend_Controller</classname> ist relativ einfach. Eine Anfrage
  161. wird vom <classname>Zend_Controller_Front</classname> empfangen, der wiederum
  162. <classname>Zend_Controller_Router_Rewrite</classname> aufruft, um zu ermitteln, welcher
  163. Controller (und welche Aktion in dem Controller) ausgeführt werden soll.
  164. <classname>Zend_Controller_Router_Rewrite</classname> zerteilt die <acronym>URI</acronym>
  165. um den Namen des Controllers und der Aktion für den Request zu setzen.
  166. <classname>Zend_Controller_Front</classname> durchläuft dann eine Dispatcher Schleife. Er
  167. ruft <classname>Zend_Controller_Dispatcher_Standard</classname> auf und übergibt den
  168. Request, um den Controller und die Aktion auszuführen, die im Request spezifiziert wurden
  169. (oder verwendet die Standardwerte). Wenn der Controller fertig ist, wird die Kontrolle
  170. wieder an <classname>Zend_Controller_Front</classname> übergeben. Wenn der Controller durch
  171. das Zurücksetzen des Dispatch Status des Requests angezeigt hat, dass ein weiterer
  172. Controller ausgeführt werden soll, wird der Durchlauf fortgesetzt und ein weiterer
  173. Dispatcher Prozess wird durchlaufen. Andernfalls endet der Prozess.
  174. </para>
  175. </sect1>