Zend_Controller-Migration.xml 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15156 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.migration">
  5. <title>Migration von vorhergehenden Versionen</title>
  6. <para>
  7. Die API der MVC Komponenten hat sich mit der Zeit verändert. Wer Zend Framework bereits
  8. in einer früheren Version verwendet hat, folgt dem Leitfaden unten, damit dieSkripte die
  9. neue Archtitekur verwenden.
  10. </para>
  11. <sect2 id="zend.controller.migration.fromonesixtooneseven">
  12. <title>Migration von 1.6.x zu 1.7.0 oder neuer</title>
  13. <sect3 id="zend.controller.migration.fromonesixtooneseven.dispatcher">
  14. <title>Änderungen im Dispatcher Interface</title>
  15. <para>
  16. Benutzer haben uns darauf aufmerksam gemacht das
  17. <classname>Zend_Controller_Action_Helper_ViewRenderer</classname> Methoden auf der abstrakten
  18. Dispatcher Klasse verwendet hat die nicht im Dispatcher Interface waren. Die folgenden
  19. Methoden wurden hinzugefügt um sicherzustellen das eigene Dispatcher weiterhin mit den
  20. ausgelieferten Implementierungen funktionieren:
  21. </para>
  22. <itemizedlist>
  23. <listitem><para>
  24. <code>formatModuleName()</code>: sollte verwendet werden um einen rohen Controllernamen
  25. zu nehmen, wie den einen der in einem Anfrageobjekt gepackt ist, und Ihn in einen
  26. richtigen Klassennamen zu reformatieren den eine Klasse, die
  27. <classname>Zend_Controller_Action</classname> erweitert, verwenden würde
  28. </para></listitem>
  29. </itemizedlist>
  30. </sect3>
  31. </sect2>
  32. <sect2 id="zend.controller.migration.fromoneohtoonesix">
  33. <title>Migration von 1.5.x zu 1.6.0 oder neuer</title>
  34. <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
  35. <title>Änderungen im Dispatcher Interface</title>
  36. <para>
  37. Benutzer haben uns darauf aufmerksam gemacht das sowohl <classname>Zend_Controller_Front</classname>
  38. als auch <classname>Zend_Controller_Router_Route_Module</classname> Methoden des Dispatchers verwenden
  39. die nicht im Dispatcher Interface waren. Wir haben jetzt die folgenden drei Methoden
  40. hinzugefügt um sicherzustellen das eigene Dispatcher weiterhin mit der ausgelieferten
  41. Implementation arbeiten:
  42. </para>
  43. <itemizedlist>
  44. <listitem><para>
  45. <code>getDefaultModule()</code>: Sollte den Namen des Standardmoduls zurückgeben.
  46. </para></listitem>
  47. <listitem><para>
  48. <code>getDefaultControllerName()</code>: Sollte den Namen des Standardcontrollers zurückgeben.
  49. </para></listitem>
  50. <listitem><para>
  51. <code>getDefaultAction()</code>: Sollte den Namen der Standardaktion zurückgeben.
  52. </para></listitem>
  53. </itemizedlist>
  54. </sect3>
  55. </sect2>
  56. <sect2 id="zend.controller.migration.fromoneohtoonefive">
  57. <title>Migration von 1.0.x zu 1.5.0 oder neuer</title>
  58. <para>
  59. Obwohl die meisten grundsätzlichen Funktionalitäten die gleichen bleiben und alle
  60. dokumentierten Funktionalitäten die gleichen bleiben gibt es doch ein spezielles
  61. <emphasis>undokumentiertes</emphasis> "Feature" das geändert wurde.
  62. </para>
  63. <para>
  64. Wenn URLs geschrieben werden besteht der dokumentierte Weg darin die Aktionsnamen
  65. camelCased mit einem Trennzeichen zu schreiben; diese sind normalerweise '.' oder '-',
  66. können aber im Dispatcher konfiguriert werden. Der Dispatcher ändert den Aktionsnamen
  67. intern auf Kleinschreibung und verwendet diese Trennzeichen um die Aktionsmethode
  68. wieder zu bauen indem er sie camelCase schreibt. Trotzdem, weil PHP Funktionen nicht
  69. unabhängig von der Schreibweise sind, <emphasis>könnte</emphasis> man URLs mit
  70. camelCase schreiben und der Dispatcher würde diese auf den gleichen Platz auflösen.
  71. Zum Beispiel, 'camel-cased' würde durch den Dispatcher zu 'camelCasedAction' werden;
  72. trotzdem, durch den Fall der unabhängigen Schreibweise in PHP, würden beide die selbe
  73. Methode ausführen.
  74. </para>
  75. <para>
  76. Das führt zu Problemen mit dem ViewRenderer wenn View Skripte aufgelöst werden. Der
  77. kanonische, dokumentierte Weg besteht darin das alle Trennzeichen zu Bindestrichen
  78. umgewandelt und die Wörter kleingeschrieben werden. Das erzeugt eine semantische
  79. Bindung zwischen Aktionen und View Skripten, und die Normalisierung stellt sicher
  80. das die Skripte gefunden werden. Trotzdem, wenn die Aktion 'camelCased' aufgerufen und
  81. aufgelöst wird, ist das Trennzeichen nicht mehr vorhanden, und der ViewRenderer
  82. versucht einen anderen Ort aufzulösen -- 'camelcased.phtml' statt 'camel-cased.phtml'.
  83. </para>
  84. <para>
  85. Einige Entwickler hängen an diesem "Feature", welches nie angedacht war. Verschiedene
  86. Änderungen im 1.5.0 Baum, führen dazu das der ViewRenderer diese Pfade nicht länger
  87. auflöst; die semantische Bindung wird nun erzwungen. Ale erstes, erzwingt der
  88. Dispatcher nun die Groß-/Kleinschreibung in Aktionsnamen. Das bedeutet das das
  89. hinleiten zu eigenen Aktionen über die URL durch Verwendung von camelCase nicht länger
  90. auf die gleiche Methode aufgelöst wird wie mit Trennzeichen (z.B. 'camel-casing').
  91. Das führt dazu das der ViewRenderer jetzt nur mehr zeichen-getrennte Aktionen
  92. honoriert wenn er View Skripte auflöst.
  93. </para>
  94. <para>´
  95. Wenn man findet das man auf dieses "Feature" nicht verzichten kann gibt es mehrere
  96. Optionen:
  97. </para>
  98. <itemizedlist>
  99. <listitem><para>
  100. Beste Option: Die View Skripte umbenennen. Vorteile: zukünftige Kompatibilität.
  101. Nachteile: Wenn man viele View Skripte hat die auf dem vorigen aufbauen führt
  102. das, unerwarteter Weise, zu vielen Umbenennungen die durchgeführt werden müssen.
  103. </para></listitem>
  104. <listitem>
  105. <para>
  106. Zweitbeste Option: Der ViewRenderer delegiert nun die Auflösung von View
  107. Skripten zu <classname>Zend_Filter_Inflector</classname>; man kann die Regeln des
  108. Inflectors ändern damit er nicht länger die Wörter der Aktion mit einem
  109. Bindestrich trennt:
  110. </para>
  111. <programlisting role="php"><![CDATA[
  112. $viewRenderer =
  113. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  114. $inflector = $viewRenderer->getInflector();
  115. $inflector->setFilterRule(':action', array(
  116. new Zend_Filter_PregReplace(
  117. '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
  118. ''
  119. ),
  120. 'StringToLower'
  121. ));
  122. ]]>
  123. </programlisting>
  124. <para>
  125. Der obige Code ändert den Inflector so, das er Wörter nicht länger mit einem
  126. Bindestrich trennt; Es kann auch gewünscht sein den 'StringToLower' Filter zu
  127. entfernen man die aktuellen View Skripte camelCased benannt haben
  128. <emphasis>will</emphasis>.
  129. </para>
  130. <para>
  131. Wenn die Umbenennung der View Skripte zu aufwendig oder Zeitintensiv ist, dann
  132. ist das die beste Option wenn man die Zeit hierfür findet.
  133. </para>
  134. </listitem>
  135. <listitem>
  136. <para>
  137. Die am wenigsten zu empfehlende Option: Man kann den Dispatcher dazu zwingen
  138. camelCase Aktionsnamen mit einem neuen Front Kontroller Flag
  139. 'useCaseSensitiveActions' zu bearbeiten:
  140. </para>
  141. <programlisting role="php"><![CDATA[
  142. $front->setParam('useCaseSensitiveActions', true);
  143. ]]></programlisting>
  144. <para>
  145. Das erlaubt es camelCase in der URL zu verwenden uns es trotzdem auf die
  146. gleiche Aktion aufzulösen wie wenn Trennzeichen verwendet worden wären. Das
  147. bedeutet das das Originale Problem trotzdem durchschlägt; es kann notwendig
  148. sein die zweite Option von oben zusätzlich zu verwenden um sicherzustellen
  149. das die Dinge in allen Variationen funktionieren.
  150. </para>
  151. <para>
  152. Man sollte auch beachten das die Verwendung dieses Flags eine Notiz auslöst,
  153. das dessen Verwendung nicht mehr durchgeführt werden sollte.
  154. </para>
  155. </listitem>
  156. </itemizedlist>
  157. </sect2>
  158. <sect2 id="zend.controller.migration.fromzeroninethree">
  159. <title>Migration von 0.9.3 nach 1.0.0RC1 oder neuer</title>
  160. <para>
  161. Die prinzipiellen Änderungen die durch 1.0.0RC1 angeboten werden sind die Einführung und standardmäßige
  162. Aktivierung des <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
  163. Plugins und den <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  164. Aktionhelfer. Bitte lies die Dokumentation jedes einzelnen gründlich um zu sehen wie sie arbeiten und
  165. welchen Effekt Sie auf die eigene Anwendung haben können.
  166. </para>
  167. <para>
  168. Der <code>ErrorHandler</code> Plugin läuft wärend der <code>postDispatch()</code> Prüfung auf
  169. Ausnahmen, und leitet zu einem spezifizierten Fehlerhandler Kontroller weiter. Solch ein Kontroller
  170. sollte in der eigenen Anwendung inkludiert werden. Er kann deaktiviert werden durch das setzen des
  171. Frontkontroller Parameters <code>noErrorHandler</code>:
  172. </para>
  173. <programlisting role="php"><![CDATA[
  174. $front->setParam('noErrorHandler', true);
  175. ]]></programlisting>
  176. <para>
  177. Der <code>ViewRenderer</code> Aktionhelfer automatisiert die Injizierung der View in den Aktionkontroller
  178. genauso wie das autorendern von Viewskripten basierend auf die aktuelle Aktion. Das primäre Problem
  179. dem man begegnen kann ist, wenn man Aktionen hat die keine View Skripte rendern und weder vorwärts- noch
  180. weiterleiten, da der <code>ViewRenderer</code> versucht ein View Skript zu Rendern basierend auf dem
  181. Aktionnamen.
  182. </para>
  183. <para>
  184. Es gibt verschiedene Strategien die man anwenden kann um den eigenen Code upzudaten. In kurzer Form,
  185. kann man global den <code>ViewRenderer</code> im eigenen Frontkontroller Bootstrap vor dem
  186. Abarbeiten ausschalten:
  187. </para>
  188. <programlisting role="php"><![CDATA[
  189. // Annahme das $front eine Instanz von Zend_Controller_Front ist
  190. $front->setParam('noViewRenderer', true);
  191. ]]></programlisting>
  192. <para>
  193. Trotzdem ist es keine gute Langzeitstrategie, da es auch bedeutet das man mehr Code schreiben muß.
  194. </para>
  195. <para>
  196. Wenn man bereit ist damit zu beginnen die <code>ViewRenderer</code> Funktionalität zu verwenden, gibt
  197. es verschiedene Dinge die man im eigenen Kontrollercode beachten muß. Zuerst muß auf die Aktionmethoden
  198. (die Methoden die mit 'Action' enden) geachtet werden, und ausgesucht werden was eine jede machen soll.
  199. Wenn nichts vom folgenden passiert, muß man Änderungen durchführen:
  200. </para>
  201. <itemizedlist>
  202. <listitem><para>Aufruf von <code>$this-&gt;render()</code></para></listitem>
  203. <listitem><para>Aufruf von <code>$this-&gt;_forward()</code></para></listitem>
  204. <listitem><para>Aufruf von <code>$this-&gt;_redirect()</code></para></listitem>
  205. <listitem><para>Aufruf des <code>Redirector</code> Aktionhelfers</para></listitem>
  206. </itemizedlist>
  207. <para>
  208. Die einfachste Änderung ist das ausschalten des Auto-Rendering für diese Methode:
  209. </para>
  210. <programlisting role="php"><![CDATA[
  211. $this->_helper->viewRenderer->setNoRender();
  212. ]]></programlisting>
  213. <para>
  214. Wenn man herausfindet das keine der eigenen Aktionmethoden rendern, weiterleiten oder umleiten, wird man
  215. voraussichtlich die oben angeführte Zeile in die eigene <code>preDispatch()</code> oder
  216. <code>init()</code> Methode einfügen wollen:
  217. </para>
  218. <programlisting role="php"><![CDATA[
  219. public function preDispatch()
  220. {
  221. // Ausschalten des autorendern vom View Skript
  222. $this->_helper->viewRenderer->setNoRender()
  223. // .. andere Dinge tun...
  224. }
  225. ]]></programlisting>
  226. <para>
  227. Wenn <code>render()</code> aufgerufen wird, und man
  228. <link linkend="zend.controller.modular">die konventionelle Modulare Verzeichnis Struktur</link>
  229. verwendet, wird man den Code ändern wollen um Autorendern zu Verwenden:
  230. </para>
  231. <itemizedlist>
  232. <listitem>
  233. <para>
  234. Wenn man mehrere View Skripte in einer einzelnen Aktion rendert muß nichts geändert werden.
  235. </para>
  236. </listitem>
  237. <listitem>
  238. <para>
  239. Wenn man einfach <code>render()</code> ohne Argumente aufruft, können diese Zeilen entfernt
  240. werden.
  241. </para>
  242. </listitem>
  243. <listitem>
  244. <para>
  245. Wenn man <code>render()</code> mit Argumenten aufruft, und danach nicht irgendeine Bearbeitung
  246. durchführt oder mehrere View sktipe rendert, können diese Aufrufe zu
  247. <code>$this-&gt;_helper-&gt;viewRenderer()</code> geändert werden.
  248. </para>
  249. </listitem>
  250. </itemizedlist>
  251. <para>
  252. Wenn die konventionelle modulare Verzeichnisstruktur nicht verwendet wird, gibt es eine Vielzahl von
  253. Methoden für das Setzen des View Basispfades und der Skript Pfadspezifikationen so das man den
  254. <code>ViewRenderer</code> verwenden kann. Bitte lies die
  255. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer Dokumentation</link> für
  256. Informationen über diese Methoden.
  257. </para>
  258. <para>
  259. Wenn ein View Objekt von der Registry verwendet, oder das eigene View Objekt verändert, oder
  260. eine andere View Implementation verwendet wird wird man den <code>ViewRenderer</code> in diesem
  261. Objekt injiziieren wollen. Das kann ganz einfach jederzeit durchgeführt werden.
  262. </para>
  263. <itemizedlist>
  264. <listitem>
  265. <para>
  266. Vor dem verarbeiten einer Frontkontroller Instanz:
  267. </para>
  268. <programlisting role="php"><![CDATA[
  269. // Annahme das $view bereits definiert wurde
  270. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  271. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  272. ]]></programlisting>
  273. </listitem>
  274. <listitem>
  275. <para>
  276. Jederzeit wärend des Bootstrap Prozesses:
  277. </para>
  278. <programlisting role="php"><![CDATA[
  279. $viewRenderer =
  280. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  281. $viewRenderer->setView($view);
  282. ]]></programlisting>
  283. </listitem>
  284. </itemizedlist>
  285. <para>
  286. Es gibt viele Wege den <code>ViewRenderer</code> zu modifizieren inklusive dem Setzen eines anderen
  287. View Skripts zum Rendern, dem Spezifizieren von Veränderungen für alle veränderbaren Elemente eines
  288. View Skript Pfades (inklusive der Endung), dem Auswählen eines Antwort-benannten Segments zur
  289. Anpassung und mehr. Wenn die konventionelle modulare Verzeichnisstruktur nicht verwendet wird, kann
  290. noch immer eine andere Pfad Spezifikation mit dem <code>ViewRenderer</code> zugeordnet werden.
  291. </para>
  292. <para>
  293. Wir empfehlen die Adaptierung des eigenen Codes um den <code>ErrorHandler</code> und
  294. <code>ViewRenderer</code> zu verwenden da diese neue Kernfunktionalitäten sind.
  295. </para>
  296. </sect2>
  297. <sect2 id="zend.controller.migration.fromzeroninetwo">
  298. <title>Migration von 0.9.2 nach 0.9.3 oder neuer</title>
  299. <para>
  300. 0.9.3 bietet <link linkend="zend.controller.actionhelpers">Aktionhelfer</link> neu an.
  301. Als Teil dieser Änderung wurden die folgenden Methoden entfernt da Sie nun im
  302. <link linkend="zend.controller.actionhelpers.redirector">Weiterleitungs Aktionhelfer</link> inkludiert
  303. sind:
  304. </para>
  305. <itemizedlist>
  306. <listitem>
  307. <para>
  308. <code>setRedirectCode()</code>; wurde umbenannt in
  309. <classname>Zend_Controller_Action_Helper_Redirector::setCode()</classname>.
  310. </para>
  311. </listitem>
  312. <listitem>
  313. <para>
  314. <code>setRedirectPrependBase()</code>; wurde umbenannt in
  315. <classname>Zend_Controller_Action_Helper_Redirector::setPrependBase()</classname>.
  316. </para>
  317. </listitem>
  318. <listitem>
  319. <para>
  320. <code>setRedirectExit()</code>; wurde umbenannt in
  321. <classname>Zend_Controller_Action_Helper_Redirector::setExit()</classname>.
  322. </para>
  323. </listitem>
  324. </itemizedlist>
  325. <para>
  326. Lese die <link linkend="zend.controller.actionhelpers">Aktionhelfer Dokumentation</link> für nähere
  327. Informationen über das empfangen und manipulieren von Helfer Objekten und die
  328. <link linkend="zend.controller.actionhelpers.redirector">Weiterleitungshelfer Dokumentation</link> für
  329. weitere Information über das setzen von Weiterleitungsoptionen (sowie alternative Methoden des
  330. weiterleitens).
  331. </para>
  332. </sect2>
  333. <sect2 id="zend.controller.migration.fromzerosix">
  334. <title>Migration von 0.6.0 nach 0.8.0 oder neuer</title>
  335. <para>
  336. Durch bisherige Änderungen bleibt die wesentliche Verwendung der MVC Komponenten gleich:
  337. </para>
  338. <programlisting role="php"><![CDATA[
  339. require_once 'Zend/Controller/Front.php';
  340. Zend_Controller_Front::run('/path/to/controllers');
  341. ]]></programlisting>
  342. <para>
  343. Dennoch wurde die Verzeichnisstruktur gründliche überarbeitet, verschiedene Komponenten
  344. wurden entfernt und mehrere andere umbenannt und hinzugefügt. Die Änderungen beinhalten:
  345. </para>
  346. <itemizedlist>
  347. <listitem>
  348. <para>
  349. <classname>Zend_Controller_Router</classname> wurde entfernt für den Rewrite Router
  350. entfernt.
  351. </para>
  352. </listitem>
  353. <listitem>
  354. <para>
  355. <classname>Zend_Controller_RewriteRouter</classname> wurde in
  356. <classname>Zend_Controller_Router_Rewrite</classname> umbenannt und zum Standard Router
  357. befördert, der mit dem Framework ausgeliefert wird;
  358. <classname>Zend_Controller_Front</classname> wird ihn als Standard verwenden, wenn kein
  359. anderer Router übergeben wird.
  360. </para>
  361. </listitem>
  362. <listitem>
  363. <para>
  364. Eine neue Route Klasse für die Verwendung mit dem Rewrite Router wurde
  365. eingeführt: <classname>Zend_Controller_Router_Route_Module</classname>; sie deckt die
  366. Standardrouten ab, die vom MVC verwendet werden und bietet die Unterstützung
  367. für <link linkend="zend.controller.modular">Controller Module</link>.
  368. </para>
  369. </listitem>
  370. <listitem>
  371. <para>
  372. <classname>Zend_Controller_Router_StaticRoute</classname> wurde umbenannt in
  373. <classname>Zend_Controller_Router_Route_Static</classname>.
  374. </para>
  375. </listitem>
  376. <listitem>
  377. <para>
  378. <classname>Zend_Controller_Dispatcher</classname> wurde umbenannt in
  379. <classname>Zend_Controller_Dispatcher_Standard</classname>.
  380. </para>
  381. </listitem>
  382. <listitem>
  383. <para>
  384. <classname>Zend_Controller_Action::_forward()</classname>'s Argumente wurden geändert.
  385. Die Signatur ist nun:
  386. </para>
  387. <programlisting role="php"><![CDATA[
  388. final protected function _forward($action,
  389. $controller = null,
  390. $module = null,
  391. array $params = null);
  392. ]]></programlisting>
  393. <para>
  394. <code>$action</code> wird immer benötigt; wenn kein Controller angegeben wird,
  395. wird eine Action im aktuellen Controller angenommen. <code>$module</code> wird
  396. immer ignoriert, es sei denn <code>$controller</code> wird angegeben.
  397. Schließlich werden alle übergebenen Parameter <code>$params</code> an das
  398. Request Objekt angehängt. Wenn man keinen Controller oder kein Modul angeben,
  399. aber dennoch Parameter übergeben möchte, gibt man einfach null für diese Werte
  400. an.
  401. </para>
  402. </listitem>
  403. </itemizedlist>
  404. </sect2>
  405. <sect2 id="zend.controller.migration.fromzerotwo">
  406. <title>Migration von 0.2.0 oder früher nach 0.6.0</title>
  407. <para>
  408. Die grundlegende Verwendung der MVC Komponenten hat sich nicht verändert; man kann immer
  409. noch das folgende machen:
  410. </para>
  411. <programlisting role="php"><![CDATA[
  412. require_once 'Zend/Controller/Front.php';
  413. Zend_Controller_Front::run('/path/to/controllers');
  414. ]]></programlisting>
  415. <programlisting role="php"><![CDATA[
  416. /* -- Erstelle einen Router -- */
  417. $router = new Zend_Controller_RewriteRouter();
  418. $router->addRoute('user',
  419. 'user/:username',
  420. array('controller' => 'user', 'action' => 'info')
  421. );
  422. /* -- Setze ihn im Controller -- */
  423. $ctrl = Zend_Controller_Front::getInstance();
  424. $ctrl->setRouter($router);
  425. /* -- Setze da Controller Verzeichnis und starte die Verarbeitung -- */
  426. $ctrl->setControllerDirectory('/path/to/controllers');
  427. $ctrl->dispatch();
  428. ]]></programlisting>
  429. <para>
  430. Wir empfehlen die Verwendung des Response Objektes, um Inhalte und Header zu sammeln.
  431. Dies erlaubt den flexibleren Wechsel von Ausgabeformaten (z.B. JSON oder XML statt
  432. XHTML) in deiner Applikation. Standardmäßig verarbeitet <code>dispatch()</code> die
  433. Antwort, sendet Header und gibt die Inhalte aus. Man kann den Front Controller auch
  434. auffordern, die Antwort durch <code>returnResponse()</code> zurückzugeben und die
  435. Antwort dann auf eigene Weise ausgeben. Eine zukünftige Version des Front Controllers
  436. könnte die Verwendung des Response Objektes durch Output Buffering erzwingen.
  437. </para>
  438. <para>
  439. Es gibt viele weitere zusätzliche Funktionalitäten, welche die vorherige API erweitern.
  440. Diese sind in der Dokumentation aufgeführt.
  441. </para>
  442. <para>
  443. Die meisten Änderungen, die man beachten muss, betreffen das Erweitern der diversen
  444. Komponenten. Die wichtigsten davon sind:
  445. </para>
  446. <itemizedlist>
  447. <listitem>
  448. <para>
  449. <classname>Zend_Controller_Front::dispatch()</classname> fängt standardmäßig die Ausnahmen
  450. im Response Objekt ab und gibt sie nicht aus, um sicherzugehen, dass keine
  451. sensitiven Systeminformationen ausgegeben werden. Man kann dies auf mehrere
  452. Arten überschreiben:
  453. </para>
  454. <itemizedlist>
  455. <listitem>
  456. <para>
  457. Setzen von <code>throwExceptions()</code> im Front Controller:
  458. </para>
  459. <programlisting role="php"><![CDATA[
  460. $front->throwExceptions(true);
  461. ]]></programlisting>
  462. </listitem>
  463. <listitem>
  464. <para>
  465. Setzen von <code>renderExceptions()</code> im Response objekt:
  466. </para>
  467. <programlisting role="php"><![CDATA[
  468. $response->renderExceptions(true);
  469. $front->setResponse($response);
  470. $front->dispatch();
  471. // oder:
  472. $front->returnResponse(true);
  473. $response = $front->dispatch();
  474. $response->renderExceptions(true);
  475. echo $response;
  476. ]]></programlisting>
  477. </listitem>
  478. </itemizedlist>
  479. </listitem>
  480. <listitem><para>
  481. <classname>Zend_Controller_Dispatcher_Interface::dispatch()</classname>
  482. akzeptiert und gibt nun ein <xref linkend="zend.controller.request" />
  483. Objekt anstelle eines Dispatcher Token zurück.
  484. </para></listitem>
  485. <listitem><para>
  486. <classname>Zend_Controller_Router_Interface::route()</classname>
  487. akzeptiert und gibt nun ein <xref linkend="zend.controller.request" />
  488. Objekt anstelle eines Dispatcher Token zurück.
  489. </para></listitem>
  490. <listitem>
  491. <para><classname>Zend_Controller_Action</classname> Änderungen beinhalten:</para>
  492. <itemizedlist>
  493. <listitem><para>
  494. Der Konstruktur akzeptiert nun genau drei Argumente,
  495. <classname>Zend_Controller_Request_Abstract $request</classname>,
  496. <classname>Zend_Controller_Response_Abstract $response</classname>, und
  497. <code>array $params (optional)</code>.
  498. <classname>Zend_Controller_Action::__construct()</classname> verwendet diese, um die
  499. Request, Response und invokeArgs Eigenschaften für das Objekt zu setzen, und
  500. beim Überschreiben des Konstrukturs sollte man dies ebenfalls tun. Besser
  501. ist es, die <code>init()</code> Methode zu verwenden, um jedwede
  502. Instanzkonfiguration durchzuführen, weil diese Methode als letzte Methode
  503. des Konstrukturs aufgerufen wird.
  504. </para></listitem>
  505. <listitem><para>
  506. <code>run()</code> ist nicht länger als final definiert, wird aber auch
  507. nicht länger vom Front Controller verwendet; sein einziger Zweck ist, dass
  508. die Klasse auch als Page Controller verwendet werden kann. Sie nimmt nun
  509. zwei optionale Argument an, ein
  510. <classname>Zend_Controller_Request_Abstract $request</classname>
  511. und ein <classname>Zend_Controller_Response_Abstract $response</classname>.
  512. </para></listitem>
  513. <listitem><para>
  514. <code>indexAction()</code> muss nicht mehr länger definiert werden, aber
  515. wird als Standardaktion empfohlen. Dies erlaubt dem RewriteRouter und den
  516. Action Controllern andere Standardaktionsmethoden zu definieren.
  517. </para></listitem>
  518. <listitem><para>
  519. <code>__call()</code> sollte überschrieben werden, um jede undefinierte
  520. Aktion automatisch verarbeiten zu können.
  521. </para></listitem>
  522. <listitem><para>
  523. <code>_redirect()</code> nimmt nun ein optionales zweites Argument entgegen,
  524. den HTTP Code, der mit dem Redirect zurückgegeben werden soll, und ein
  525. optionales drittes Argument <code>$prependBase</code>, das angibt, dass die
  526. im Request Objekt registrierte Basis URL der übergebenen URL voran gestellt
  527. werden soll.
  528. </para></listitem>
  529. <listitem>
  530. <para>
  531. Die <code>_action</code> Eigenschaft wird nicht mehr gesetzt. Diese
  532. Eigenschaft war ein <classname>Zend_Controller_Dispatcher_Token</classname>, der
  533. in der aktuellen Inkarnation nicht mehr länger existiert. Der einzige
  534. Zweck des Tokens war, Informationen über angeforderte Controller,
  535. Aktion und URL Parameter bereit zu stellen. Diese Infrmationen ist nun
  536. im Request Objekt verfügbar und kann wie folgt abgerufen werden:
  537. </para>
  538. <programlisting role="php"><![CDATA[
  539. // Hole den angeforderten Controllernamen
  540. // Der Zugriff erfolgte bisher über: $this->_action->getControllerName().
  541. // Das Beispiel unten verwendet getRequest(), obwohl man auch direkt auf die
  542. // $_request Eigenschaft zugreifen kann; die Verwendung von getRequest() wird
  543. // empfohlen, da eine Elternklasse den Zugriff auf das Request Objekt
  544. // überschreiben könnte
  545. $controller = $this->getRequest()->getControllerName();
  546. // Hole den angeforderten Aktionsnamen
  547. // Der Zugriff erfolgte bisher über: $this->_action->getActionName().
  548. $action = $this->getRequest()->getActionName();
  549. // Hole die Anfrageparameter
  550. // Dies hat sich nicht verändert; die _getParams() und _getParam()
  551. // Methoden leiten nun einfach auf das Request Objekt weiter.
  552. $params = $this->_getParams();
  553. // fordere den 'foo' Parameter an und verwende
  554. // 'default', wenn kein Standardwert gefunden werden kann
  555. $foo = $this->_getParam('foo', 'default');
  556. ]]></programlisting>
  557. </listitem>
  558. <listitem>
  559. <para>
  560. <code>noRouteAction()</code> wurde entfernt. Der geeignete Weg, um
  561. nicht vorhandene Aktionsmethoden abzufangen, wenn man sie an eine
  562. Standardaktion weiter leiten möchte, sollte die Verwendung von
  563. <code>__call()</code> sein:
  564. </para>
  565. <programlisting role="php"><![CDATA[
  566. public function __call($method, $args)
  567. {
  568. // Wenn eine nicht vorhandene 'Action' Methode angefordert wurde,
  569. // leite auf die Standard Aktionsmethode um:
  570. if ('Action' == substr($method, -6)) {
  571. return $this->defaultAction();
  572. }
  573. throw new Zend_Controller_Exception('Invalid method called');
  574. }
  575. ]]></programlisting>
  576. </listitem>
  577. </itemizedlist>
  578. </listitem>
  579. <listitem><para>
  580. <classname>Zend_Controller_RewriteRouter::setRewriteBase()</classname> wurde entfernt.
  581. Stattdessen soll <classname>Zend_Controller_Front::setBaseUrl()</classname> verwendet werden
  582. (oder <classname>Zend_Controller_Request_Http::setBaseUrl()</classname>, wenn die Request Klasse verwendet
  583. wird).
  584. </para></listitem>
  585. <listitem><para>
  586. <classname>Zend_Controller_Plugin_Interface</classname> wurde durch
  587. by <classname>Zend_Controller_Plugin_Abstract</classname> ersetzt. Alle Methoden nehmen nun
  588. ein <xref linkend="zend.controller.request" /> Objekt statt eines
  589. Dispatcher Tokens entgegen bzw. geben es zurück.
  590. </para></listitem>
  591. </itemizedlist>
  592. </sect2>
  593. </sect1>
  594. <!--
  595. vim:se ts=4 sw=4 et:
  596. -->