Zend_Controller-Migration.xml 35 KB

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