migration-06.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="migration.06">
  5. <title>Zend Framework 0.6</title>
  6. <para>
  7. Wenn man von einem älteren Release auf Zend Framework 0.6 oder höher hochrüstet sollte
  8. man die folgenden Migrations Hinweise beachten.
  9. </para>
  10. <sect2 id="migration.06.zend.controller">
  11. <title>Zend_Controller</title>
  12. <para>
  13. Die grundlegende Verwendung der <acronym>MVC</acronym> Komponenten hat sich nicht
  14. verändert; man kann immer noch das folgende machen:
  15. </para>
  16. <programlisting language="php"><![CDATA[
  17. require_once 'Zend/Controller/Front.php';
  18. Zend_Controller_Front::run('/path/to/controllers');
  19. ]]></programlisting>
  20. <programlisting language="php"><![CDATA[
  21. /* -- Erstelle einen Router -- */
  22. $router = new Zend_Controller_RewriteRouter();
  23. $router->addRoute('user',
  24. 'user/:username',
  25. array('controller' => 'user', 'action' => 'info')
  26. );
  27. /* -- Setze ihn im Controller -- */
  28. $ctrl = Zend_Controller_Front::getInstance();
  29. $ctrl->setRouter($router);
  30. /* -- Setze da Controller Verzeichnis und starte die Verarbeitung -- */
  31. $ctrl->setControllerDirectory('/path/to/controllers');
  32. $ctrl->dispatch();
  33. ]]></programlisting>
  34. <para>
  35. Wir empfehlen die Verwendung des Response Objektes, um Inhalte und Header zu sammeln.
  36. Dies erlaubt den flexibleren Wechsel von Ausgabeformaten (z.B. <acronym>JSON</acronym>
  37. oder <acronym>XML</acronym> statt <acronym>XHTML</acronym>) in deiner Applikation.
  38. Standardmäßig verarbeitet <methodname>dispatch()</methodname> die Antwort, sendet
  39. Header und gibt die Inhalte aus. Man kann den Front Controller auch auffordern, die
  40. Antwort durch <methodname>returnResponse()</methodname> zurückzugeben und die Antwort
  41. dann auf eigene Weise ausgeben. Eine zukünftige Version des Front Controllers könnte
  42. die Verwendung des Response Objektes durch Output Buffering erzwingen.
  43. </para>
  44. <para>
  45. Es gibt viele weitere zusätzliche Funktionalitäten, welche die vorherige
  46. <acronym>API</acronym> erweitern. Diese sind in der Dokumentation aufgeführt.
  47. </para>
  48. <para>
  49. Die meisten Änderungen, die man beachten muss, betreffen das Erweitern der diversen
  50. Komponenten. Die wichtigsten davon sind:
  51. </para>
  52. <itemizedlist>
  53. <listitem>
  54. <para>
  55. <methodname>Zend_Controller_Front::dispatch()</methodname> fängt standardmäßig
  56. die Ausnahmen im Response Objekt ab und gibt sie nicht aus, um sicherzugehen,
  57. dass keine sensitiven Systeminformationen ausgegeben werden. Man kann dies auf
  58. mehrere Arten überschreiben:
  59. </para>
  60. <itemizedlist>
  61. <listitem>
  62. <para>
  63. Setzen von <methodname>throwExceptions()</methodname> im Front
  64. Controller:
  65. </para>
  66. <programlisting language="php"><![CDATA[
  67. $front->throwExceptions(true);
  68. ]]></programlisting>
  69. </listitem>
  70. <listitem>
  71. <para>
  72. Setzen von <methodname>renderExceptions()</methodname> im Response
  73. Objekt:
  74. </para>
  75. <programlisting language="php"><![CDATA[
  76. $response->renderExceptions(true);
  77. $front->setResponse($response);
  78. $front->dispatch();
  79. // oder:
  80. $front->returnResponse(true);
  81. $response = $front->dispatch();
  82. $response->renderExceptions(true);
  83. echo $response;
  84. ]]></programlisting>
  85. </listitem>
  86. </itemizedlist>
  87. </listitem>
  88. <listitem>
  89. <para>
  90. <methodname>Zend_Controller_Dispatcher_Interface::dispatch()</methodname>
  91. akzeptiert und gibt nun ein <link
  92. linkend="zend.controller.request">Anfrage Objekt</link> anstelle eines
  93. Dispatcher Token zurück.
  94. </para>
  95. </listitem>
  96. <listitem>
  97. <para>
  98. <methodname>Zend_Controller_Router_Interface::route()</methodname>
  99. akzeptiert und gibt nun ein <link
  100. linkend="zend.controller.request">Anfrage Objekt</link> anstelle eines
  101. Dispatcher Token zurück.
  102. </para>
  103. </listitem>
  104. <listitem>
  105. <para><classname>Zend_Controller_Action</classname> Änderungen beinhalten:</para>
  106. <itemizedlist>
  107. <listitem>
  108. <para>
  109. Der Konstruktur akzeptiert nun genau drei Argumente,
  110. <classname>Zend_Controller_Request_Abstract</classname>
  111. <varname>$request</varname>,
  112. <classname>Zend_Controller_Response_Abstract</classname>
  113. <varname>$response</varname>, und
  114. <type>Array</type> <varname>$params</varname> (Optional).
  115. <methodname>Zend_Controller_Action::__construct()</methodname>
  116. verwendet diese, um die Request, Response und invokeArgs Eigenschaften
  117. für das Objekt zu setzen, und beim Überschreiben des Konstrukturs
  118. sollte man dies ebenfalls tun. Besser ist es, die
  119. <methodname>init()</methodname> Methode zu verwenden, um jedwede
  120. Instanzkonfiguration durchzuführen, weil diese Methode als letzte
  121. Methode des Konstrukturs aufgerufen wird.
  122. </para>
  123. </listitem>
  124. <listitem>
  125. <para>
  126. <methodname>run()</methodname> ist nicht länger als final definiert,
  127. wird aber auch nicht länger vom Front Controller verwendet; sein
  128. einziger Zweck ist, dass die Klasse auch als Page Controller verwendet
  129. werden kann. Sie nimmt nun zwei optionale Argument an, ein
  130. <classname>Zend_Controller_Request_Abstract</classname>
  131. <varname>$request</varname> und ein
  132. <classname>Zend_Controller_Response_Abstract</classname>
  133. <varname>$response</varname>.
  134. </para>
  135. </listitem>
  136. <listitem>
  137. <para>
  138. <methodname>indexAction()</methodname> muss nicht mehr länger definiert
  139. werden, aber wird als Standardaktion empfohlen. Dies erlaubt dem
  140. RewriteRouter und den Action Controllern andere Standardaktionsmethoden
  141. zu definieren.
  142. </para>
  143. </listitem>
  144. <listitem>
  145. <para>
  146. <methodname>__call()</methodname> sollte überschrieben werden, um jede
  147. undefinierte Aktion automatisch verarbeiten zu können.
  148. </para>
  149. </listitem>
  150. <listitem>
  151. <para>
  152. <methodname>_redirect()</methodname> nimmt nun ein optionales zweites
  153. Argument entgegen, den <acronym>HTTP</acronym> Code, der mit dem
  154. Redirect zurückgegeben werden soll, und ein optionales drittes Argument
  155. <varname>$prependBase</varname>, das angibt, dass die im Request Objekt
  156. registrierte Basis URL der übergebenen <acronym>URL</acronym> voran
  157. gestellt werden soll.
  158. </para>
  159. </listitem>
  160. <listitem>
  161. <para>
  162. Die <varname>$_action</varname> Eigenschaft wird nicht mehr gesetzt.
  163. Diese Eigenschaft war ein
  164. <classname>Zend_Controller_Dispatcher_Token</classname>, der in der
  165. aktuellen Inkarnation nicht mehr länger existiert. Der einzige Zweck
  166. des Tokens war, Informationen über angeforderte Controller, Aktion und
  167. <acronym>URL</acronym> Parameter bereit zu stellen. Diese Infrmationen
  168. ist nun im Request Objekt verfügbar und kann wie folgt abgerufen
  169. werden:
  170. </para>
  171. <programlisting language="php"><![CDATA[
  172. // Hole den angeforderten Controllernamen
  173. // Der Zugriff erfolgte bisher über: $this->_action->getControllerName().
  174. // Das Beispiel unten verwendet getRequest(), obwohl man auch direkt auf die
  175. // $_request Eigenschaft zugreifen kann; die Verwendung von getRequest() wird
  176. // empfohlen, da eine Elternklasse den Zugriff auf das Request Objekt
  177. // überschreiben könnte
  178. $controller = $this->getRequest()->getControllerName();
  179. // Hole den angeforderten Aktionsnamen
  180. // Der Zugriff erfolgte bisher über: $this->_action->getActionName().
  181. $action = $this->getRequest()->getActionName();
  182. // Hole die Anfrageparameter
  183. // Dies hat sich nicht verändert; die _getParams() und _getParam()
  184. // Methoden leiten nun einfach auf das Request Objekt weiter.
  185. $params = $this->_getParams();
  186. // fordere den 'foo' Parameter an und verwende
  187. // 'default', wenn kein Standardwert gefunden werden kann
  188. $foo = $this->_getParam('foo', 'default');
  189. ]]></programlisting>
  190. </listitem>
  191. <listitem>
  192. <para>
  193. <methodname>noRouteAction()</methodname> wurde entfernt. Der geeignete
  194. Weg, um nicht vorhandene Aktionsmethoden abzufangen, wenn man sie an
  195. eine Standardaktion weiter leiten möchte, sollte die Verwendung von
  196. <methodname>__call()</methodname> sein:
  197. </para>
  198. <programlisting language="php"><![CDATA[
  199. public function __call($method, $args)
  200. {
  201. // Wenn eine nicht vorhandene 'Action' Methode angefordert wurde,
  202. // leite auf die Standard Aktionsmethode um:
  203. if ('Action' == substr($method, -6)) {
  204. return $this->defaultAction();
  205. }
  206. throw new Zend_Controller_Exception('Invalid method called');
  207. }
  208. ]]></programlisting>
  209. </listitem>
  210. </itemizedlist>
  211. </listitem>
  212. <listitem>
  213. <para>
  214. <methodname>Zend_Controller_RewriteRouter::setRewriteBase()</methodname> wurde
  215. entfernt. Stattdessen soll
  216. <methodname>Zend_Controller_Front::setBaseUrl()</methodname> verwendet werden
  217. (oder <methodname>Zend_Controller_Request_Http::setBaseUrl()</methodname>, wenn
  218. die Request Klasse verwendet wird).
  219. </para>
  220. </listitem>
  221. <listitem>
  222. <para>
  223. <classname>Zend_Controller_Plugin_Interface</classname> wurde durch
  224. <classname>Zend_Controller_Plugin_Abstract</classname> ersetzt. Alle Methoden
  225. nehmen nun ein <link linkend="zend.controller.request">Request Objekt</link>
  226. statt eines Dispatcher Tokens entgegen bzw. geben es zurück.
  227. </para>
  228. </listitem>
  229. </itemizedlist>
  230. </sect2>
  231. </sect1>