Zend_Controller-Migration.xml 34 KB

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