Zend_Controller-Request.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20765 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.request">
  5. <title>Das Request Objekt</title>
  6. <sect2 id="zend.controller.request.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Das Request Objekt ist eine einfaches Wertobjekt, das zwischen
  10. <classname>Zend_Controller_Front</classname> und den Router, Dispatcher und Controller
  11. Klassen übergeben wird. Es enthält sowohl die Definition des Controllers, der Aktion und
  12. der Parameter, die an die Aktion übergeben werden sollen, als auch den Rest der
  13. Anfrageumgebung, seit es <acronym>HTTP</acronym>, <acronym>CLI</acronym> oder
  14. <acronym>PHP</acronym>-GTK.
  15. </para>
  16. <itemizedlist>
  17. <listitem>
  18. <para>
  19. Auf den Modul Namen kann über <methodname>getModuleName()</methodname> und
  20. <methodname>setModuleName()</methodname> zugegriffen werden.
  21. </para>
  22. </listitem>
  23. <listitem>
  24. <para>
  25. Auf den Controller Namen kann über <methodname>getControllerName()</methodname>
  26. und <methodname>setControllerName()</methodname> zugegriffen werden.
  27. </para>
  28. </listitem>
  29. <listitem>
  30. <para>
  31. Auf den Namen der Aktion, die in diesem Controller aufgerufen wird, kann über
  32. accessed by <methodname>getActionName()</methodname> und
  33. <methodname>setActionName()</methodname> zugegriffen werden.
  34. </para>
  35. </listitem>
  36. <listitem>
  37. <para>
  38. Parameter, die von der Aktion ansprechbar sind, bestehen aus einem assoziativen
  39. Array mit Schlüssel und Werte Paaren, auf die komplett per
  40. <methodname>getParams()</methodname> und <methodname>setParams()</methodname>
  41. oder einzeln per <methodname>getParam()</methodname> und
  42. <methodname>setParam()</methodname> zugegriffen werden kann.
  43. </para>
  44. </listitem>
  45. </itemizedlist>
  46. <para>
  47. Abhängig vom Typ der Anfrage können auch weitere Methoden verfügbar sein. Das
  48. verwendete Standard Request Object <classname>Zend_Controller_Request_Http</classname>
  49. stellt z.B. Methoden zum Abfragen der Request <acronym>URI</acronym>, Pfadinformationen,
  50. <varname>$_GET</varname> und <varname>$_POST</varname> Parameter usw. bereit.
  51. </para>
  52. <para>
  53. Das Request Objekt wird an den Front Controller übergeben oder, wenn keines bereit
  54. gestellt wurde, am Anfang des Dispatcher Prozesses instanziert, bevor das Routing
  55. beginnt. Es wird an jedes Objekt in der Dispatcherkette übergeben.
  56. </para>
  57. <para>
  58. Zusätzlich ist das Request Object besonders beim Testen sehr nützlich. Der Entwickler
  59. kann die Anfrageumgebung von Hand erstellen, inklusive Controller, Aktion, Parameter,
  60. <acronym>URI</acronym> usw. und das Request Objekt an den Front Controller übrgeben, um
  61. den Ablauf der Applikation zu testen. Zusammen mit dem
  62. <link linkend="zend.controller.response">Response Objekt</link> sind durchdachte und
  63. genaue Unit Tests für eine <acronym>MVC</acronym> Applikation möglich.
  64. </para>
  65. </sect2>
  66. <sect2 id="zend.controller.request.http">
  67. <title>HTTP Anfragen</title>
  68. <sect3 id="zend.controller.request.http.dataacess">
  69. <title>Auf Request Daten zugreifen</title>
  70. <para>
  71. <classname>Zend_Controller_Request_Http</classname> kapselt den Zugriff auf
  72. relevante Werte wie der Schlüssel und Wert für Controller und Action Variablen des
  73. Routers und alle zusätzlichen Parameter, die aus der <acronym>URI</acronym>
  74. ermittelt wurden. Es erlaubt zusätzlich den Zugriff auf superglobale Werte als
  75. öffentliche Eigenschaften und verwaltet die aktuelle Basis <acronym>URL</acronym>
  76. und Request <acronym>URI</acronym>. Superglobale Werte können in einem Request
  77. Objekt nicht gesetzt werden, stattdessen verwendet man die
  78. <methodname>setParam()</methodname> und <methodname>getParam()</methodname>
  79. Methoden um Benutzerparameter zu setzen oder zu erhalten.
  80. </para>
  81. <note>
  82. <title>Superglobale Daten</title>
  83. <para>
  84. Beim Zugriff auf superglobale Daten über die öffentlichen Eigenschaften von
  85. <classname>Zend_Controller_Request_Http</classname> ist es notwendig, darauf zu
  86. achten, dass der Eigenschaftsname (der superglobale Arrayschlüssel) einem
  87. superglobalen Wert in einer bestimmten Reihenfolge entspricht: 1.
  88. <constant>GET</constant>, 2. <constant>POST</constant>, 3.
  89. <constant>COOKIE</constant>, 4. <constant>SERVER</constant>, 5.
  90. <constant>ENV</constant>.
  91. </para>
  92. </note>
  93. <para>
  94. Auf spezifische superglobale Werte kann alternativ über eine öffentliche Methode
  95. zugegriffen werden. Zum Beispiel kann auf den unverarbeitete Wert von
  96. <varname>$_POST['user']</varname> durch Aufruf der
  97. <methodname>getPost('user')</methodname> Methode des Request Objekts zugegriffen
  98. werden. Diese beinhalten <methodname>getQuery()</methodname>, um
  99. <varname>$_GET</varname> Elemente zu erhalten und
  100. <methodname>getHeader()</methodname>, um Request Header zu erhalten.
  101. </para>
  102. <note>
  103. <title>GET und POST Daten</title>
  104. <para>
  105. Vorsicht wenn auf Daten von einem Anfrage Objekt zugegriffen wird da diese in
  106. keiner Weise gefiltert werden. Der Router und Dispatcher prüfen und filtern
  107. Daten für die Verwendung innerhalb Ihrer Aufgabe, lassen diese Daten aber
  108. unangetastet im Anfrage Objekt.
  109. </para>
  110. </note>
  111. <note>
  112. <title>Empfangen der rohen POST Daten!</title>
  113. <para>
  114. Mit 1.5.0 können auch die rohen Post Daten über die
  115. <methodname>getRawBody()</methodname> Methode empfangen werden. Diese Methode
  116. gibt <constant>FALSE</constant> zurück wenn keine Daten auf diesem Weg
  117. übermittelt wurden, andernfalls den kompletten Inhalt von Post.
  118. </para>
  119. <para>
  120. Das ist grundsätzlich sinnvoll um Inhalt zu akzeptieren wenn eine RESTvolle
  121. <acronym>MVC</acronym> Anwendung entwickelt wird.
  122. </para>
  123. </note>
  124. <para>
  125. Es können auch Benutzerparameter im Anfrage Objekt gesetzt werden durch Verwendung
  126. von <methodname>setParam()</methodname> und empfangen derselben später durch
  127. verwenden von <methodname>getParam()</methodname>. Der Router verwendet diese
  128. Funktionalität um passende Parameter in der Anfrage <acronym>URI</acronym> im
  129. Anfrage Objekt zu setzen.
  130. </para>
  131. <note>
  132. <title>getParam() empfängt mehr als Benutzer Parameter</title>
  133. <para>
  134. Um einiges Ihrer Arbeit zu tun, empfängt <methodname>getParam()</methodname>
  135. von verschiedenen Quellen. Je nach Priorität enthalten diese: Benutzer
  136. Parameter die über <methodname>setParam()</methodname> gesetzt wurden,
  137. <constant>GET</constant> Parameter, und letztendlich <constant>POST</constant>
  138. Parameter. Aufpassen vor dem Durchlaufen von Daten mit dieser Methode.
  139. </para>
  140. <para>
  141. Wenn man nur Parameter erhalten will die vorher mit
  142. <methodname>setParam()</methodname> gesetzt wurden, muß
  143. <methodname>getUserParam()</methodname> verwendet werden.
  144. </para>
  145. <para>
  146. Zusätzlich, sein 1.5.0, kann gesperrt werden welche Quellparameter gesucht
  147. werden. <methodname>setParamSources()</methodname> erlaubt es ein leeres Array
  148. zu spezifizieren oder ein Array mit einem oder mehreren Werten von '_GET' oder
  149. '_POST' um zu zeigen welche Quellparameter erlaubt sind (standardmäßig sind
  150. beide erlaubt); Wenn der Zugriff nur auf '_GET' beschränkt werden soll muß
  151. <methodname>setParamSources(array('_GET'))</methodname> spezifiziert werden.
  152. </para>
  153. </note>
  154. <note>
  155. <title>Apache Quirks</title>
  156. <para>
  157. Wenn Apache's 404 Handler verwendet wird um eingehende Anfragen an den Front
  158. Controller zu übergeben, oder ein PT Flag mit Rewrite Regeln verwendet wird,
  159. enthält <varname>$_SERVER['REDIRECT_URL']</varname> die <acronym>URI</acronym>
  160. die benötigt wird, nicht <varname>$_SERVER['REQUEST_URI']</varname>. Wenn so ein
  161. Setup verwendet wird und man ungültige Routen erhält, sollte man stattdessen die
  162. <classname>Zend_Controller_Request_Apache404</classname> Klasse statt der
  163. standard Http Klasse für das Anfrage Objekt verwenden:
  164. </para>
  165. <programlisting language="php"><![CDATA[
  166. $request = new Zend_Controller_Request_Apache404();
  167. $front->setRequest($request);
  168. ]]></programlisting>
  169. <para>
  170. Diese Klasse erweitert die <classname>Zend_Controller_Request_Http</classname>
  171. Klasse und modifiziert einfach die automatische Entdeckung der Anfrage
  172. <acronym>URI</acronym>. Sie kann als einfache Ersetzung verwendet werden.
  173. </para>
  174. </note>
  175. </sect3>
  176. <sect3 id="zend.controller.request.http.baseurl">
  177. <title>Basis Url und Unterverzeichnisse</title>
  178. <para>
  179. <classname>Zend_Controller_Request_Http</classname> erlaubt, dass
  180. <classname>Zend_Controller_Router_Rewrite</classname> in einem Unterverzeichnis
  181. verwendet werden kann. <classname>Zend_Controller_Request_Http</classname> versucht,
  182. die Basis <acronym>URL</acronym> automatisch zu erkennen und entsprechend zu setzen.
  183. </para>
  184. <para>
  185. Wenn man zum Beispiel seine <filename>index.php</filename> in einem
  186. Webserverunterverzeichnis mit Namen <filename>/projects/myapp/index.php</filename>
  187. verwendet, sollte die Basis <acronym>URL</acronym> (die Rewrite Basis) auf
  188. <filename>/projects/myapp</filename> gesetzt werden. Dieser String wird dann vom
  189. Anfang des Pfades entfernt, bevor irgend welche Routingtreffer ermittelt werden.
  190. Dies befreit einem davon, es an den Anfang jeder Route setzen zu müssen. Eine Route
  191. <command>'user/:username'</command> passt auf <acronym>URI</acronym>s wie
  192. <filename>http://localhost/projects/myapp/user/martel</filename> und
  193. <filename>http://example.com/user/martel</filename>.
  194. </para>
  195. <note>
  196. <title>URL Erkennung beachtet Groß- und Kleinschreibung</title>
  197. <para>
  198. Die automatische Erkennung der Basis <acronym>URL</acronym> beachtet die Groß-
  199. und Kleinschreibung, weshalb man sicherstellen sollte, dass die
  200. <acronym>URL</acronym> einem Unterverzeichnis im Dateisystem entspricht (sogar
  201. auf einem Windows Rechner). Andernfalls wird eine Ausnahme geworfen.
  202. </para>
  203. </note>
  204. <para>
  205. Sollte die Basis <acronym>URL</acronym> falsch erkannt werden, kann man diese auch
  206. mit einem eigenen Pfad mit Hilfe der <methodname>setBaseUrl()</methodname> Methode
  207. der <classname>Zend_Controller_Request_Http</classname> Klasse oder der
  208. <classname>Zend_Controller_Front</classname> Klasse überschreiben. Die einfachste
  209. Methode ist die von <classname>Zend_Controller_Front</classname>, welche es an das
  210. Request Object weiter leitet. Beispiel, um eine eigene Basis <acronym>URL</acronym>
  211. zu setzen:
  212. </para>
  213. <programlisting language="php"><![CDATA[
  214. /**
  215. * Dispatch Anfrage mit einer kunden basierenden URL mit Zend_Controller_Front.
  216. */
  217. $router = new Zend_Controller_Router_Rewrite();
  218. $controller = Zend_Controller_Front::getInstance();
  219. $controller->setControllerDirectory('./application/controllers')
  220. ->setRouter($router)
  221. ->setBaseUrl('/projects/myapp'); // Setze die Basis URL!
  222. $response = $controller->dispatch();
  223. ]]></programlisting>
  224. </sect3>
  225. <sect3 id="zend.controller.request.http.method">
  226. <title>Erkennen der Anfrage Methode</title>
  227. <para>
  228. <methodname>getMethod()</methodname> erlaubt es die <acronym>HTTP</acronym> Anfrage
  229. Methode zu erkennen die verwendet wurde um die aktuelle Ressource anzufragen.
  230. Zusätzlich existiert eine Vielzahl von Methoden die es erlauben boolsche Antworten
  231. zu erhalten wenn gefragt wird ob ein spezieller Typ von Anfrage durchgeführt wurde:
  232. </para>
  233. <itemizedlist>
  234. <listitem><para><methodname>isGet()</methodname></para></listitem>
  235. <listitem><para><methodname>isPost()</methodname></para></listitem>
  236. <listitem><para><methodname>isPut()</methodname></para></listitem>
  237. <listitem><para><methodname>isDelete()</methodname></para></listitem>
  238. <listitem><para><methodname>isHead()</methodname></para></listitem>
  239. <listitem><para><methodname>isOptions()</methodname></para></listitem>
  240. </itemizedlist>
  241. <para>
  242. Der grundsätzliche Verwendungszweck hierfür ist die Erstellung von RESTvollen
  243. <acronym>MVC</acronym> Architekturen.
  244. </para>
  245. </sect3>
  246. <sect3 id="zend.controller.request.http.ajax">
  247. <title>Erkennen von AJAX Anfragen</title>
  248. <para>
  249. <classname>Zend_Controller_Request_Http</classname> hat eine rudimentäre Methode für
  250. die Erkennung von <acronym>AJAX</acronym> Anfragen:
  251. <methodname>isXmlHttpRequest()</methodname>. Diese Methode sucht nach einem
  252. <acronym>HTTP</acronym> Anfrageheader <emphasis>X-Requested-With</emphasis> mit dem
  253. Wert 'XMLHttpRequest'; wenn er gefunden wird, gibt er <constant>TRUE</constant>
  254. zurück.
  255. </para>
  256. <para>
  257. Aktuell wird dieser Header standardmäßig mit den folgenden JS Bibliotheken
  258. geschickt:
  259. </para>
  260. <itemizedlist>
  261. <listitem>
  262. <para>
  263. Prototype und Scriptaculous (und von Prototype abgeleitete Bibliotheken)
  264. </para>
  265. </listitem>
  266. <listitem><para>Yahoo! UI Library</para></listitem>
  267. <listitem><para>jQuery</para></listitem>
  268. <listitem><para>MochiKit</para></listitem>
  269. </itemizedlist>
  270. <para>
  271. Die meisten <acronym>AJAX</acronym> Bibliotheken erlauben das Senden von eigenen
  272. <acronym>HTTP</acronym> Anfrageheadern; wenn die eigene Bibliothek diesen Header
  273. nicht sendet, muß dieser einfach beim Anfrageheader hinzugefügt werden um
  274. sicherzustellen das die <methodname>isXmlHttpRequest()</methodname> Methode
  275. funktioniert.
  276. </para>
  277. </sect3>
  278. </sect2>
  279. <sect2 id="zend.controller.request.subclassing">
  280. <title>Vererben des Anfrage Objektes</title>
  281. <para>
  282. Die Basis Anfrage Klasse die für alle Anfrage Objekte verwendet wird ist die abstrakte
  283. Klasse <classname>Zend_Controller_Request_Abstract</classname>. Sie ist sehr
  284. grundsätzlich und definiert die folgenden Methoden:
  285. </para>
  286. <programlisting language="php"><![CDATA[
  287. abstract class Zend_Controller_Request_Abstract
  288. {
  289. /**
  290. * @return string
  291. */
  292. public function getControllerName();
  293. /**
  294. * @param string $value
  295. * @return self
  296. */
  297. public function setControllerName($value);
  298. /**
  299. * @return string
  300. */
  301. public function getActionName();
  302. /**
  303. * @param string $value
  304. * @return self
  305. */
  306. public function setActionName($value);
  307. /**
  308. * @return string
  309. */
  310. public function getControllerKey();
  311. /**
  312. * @param string $key
  313. * @return self
  314. */
  315. public function setControllerKey($key);
  316. /**
  317. * @return string
  318. */
  319. public function getActionKey();
  320. /**
  321. * @param string $key
  322. * @return self
  323. */
  324. public function setActionKey($key);
  325. /**
  326. * @param string $key
  327. * @return mixed
  328. */
  329. public function getParam($key);
  330. /**
  331. * @param string $key
  332. * @param mixed $value
  333. * @return self
  334. */
  335. public function setParam($key, $value);
  336. /**
  337. * @return array
  338. */
  339. public function getParams();
  340. /**
  341. * @param array $array
  342. * @return self
  343. */
  344. public function setParams(array $array);
  345. /**
  346. * @param boolean $flag
  347. * @return self
  348. */
  349. public function setDispatched($flag = true);
  350. /**
  351. * @return boolean
  352. */
  353. public function isDispatched();
  354. }
  355. ]]></programlisting>
  356. <para>
  357. Das Anfrage Objekt ist ein Behälter für die Anfrage Umgebung. Die Controller Kette muß
  358. wirklich nur wissen wie der Controller, die Aktion, die optionalen Parameter und der
  359. Dispatched Status gesetzt und empfangen werden können. Standardmäßig durchsucht das
  360. Anfrage Objekt die eigenen Parameter indem es den Controller oder die Aktions Schlüssel
  361. verwendet um den Controller und die Aktion zu ermitteln.
  362. </para>
  363. <para>
  364. Erweitere diese Klasse, oder eine Ihrer Derivate, wenn die Anfrage Klasse mit einer
  365. speziellen Umgebung interagieren soll, um Daten für die obigen Aufgaben zu erhalten.
  366. Beispiele beinhalten <link linkend="zend.controller.request.http">die
  367. <acronym>HTTP</acronym> Umgebung</link>, eine <acronym>CLI</acronym> Umgebung, oder
  368. eine <acronym>PHP</acronym>-GTK Umgebung.
  369. </para>
  370. </sect2>
  371. </sect1>