Zend_Controller-Migration.xml 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. <sect1 id="zend.controller.migration">
  2. <title>Migracja z poprzednich wersji</title>
  3. <para>
  4. API komponentów MVC zmieniało się z biegiem czasu. Jeśli zacząłeś używać
  5. Zend Framework we wczesnej wersji, postępuj według poniższych wskazówek
  6. aby przeprowadzić migrację swoich skryptów aby używały nowej architektury.
  7. </para>
  8. <sect2 id="zend.controller.migration.fromoneohtoonesix">
  9. <title>Migracja z wersji 1.5.x do 1.6.0 lub nowszej</title>
  10. <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
  11. <title>Zmiany w interfejsie obiektu uruchamiającego</title>
  12. <para>
  13. Użytkownicy zwrócili naszą uwagę na fakt, że klasy
  14. <code>Zend_Controller_Front</code> oraz
  15. <code>Zend_Controller_Router_Route_Module</code> używały metod
  16. obiektu uruchamiającego, które nie były zdefiniowane w
  17. interfejsie tego obiektu.
  18. Dodaliśmy teraz do interfejsu poniższe trzy metody aby upewnić
  19. się, że własne obiekty uruchamiające będą poprawnie działać:
  20. </para>
  21. <itemizedlist>
  22. <listitem><para>
  23. <code>getDefaultModule()</code>: metoda powinna zwracać
  24. nazwę domyślnego modułu.
  25. </para></listitem>
  26. <listitem><para>
  27. <code>getDefaultControllerName()</code>: metoda powinna
  28. zwracać nazwę domyślnego kontrolera.
  29. </para></listitem>
  30. <listitem><para>
  31. <code>getDefaultAction()</code>: metoda powinna zwracać
  32. nazwę domyślnej akcji.
  33. </para></listitem>
  34. </itemizedlist>
  35. </sect3>
  36. </sect2>
  37. <sect2 id="zend.controller.migration.fromoneohtoonefive">
  38. <title>Migracja z wersji 1.0.x do 1.5.0 lub nowszej</title>
  39. <para>
  40. O ile większość z podstawowych funkcjonalności i cała udokumentowana
  41. funkcjonalność pozostały te same, to nastąpiła jedna istotna zmiana
  42. w jednej <emphasis>nieudokumentowanej</emphasis> funkcjonalności.
  43. </para>
  44. <para>
  45. Udokumentowanym sposobem tworzenia adresów URL w postaci camelCased
  46. jest użycie znaku separatora w nazwie akcji; domyślnie separatorem
  47. mogą być znaki '.' lub '-', jednak może to być skonfigurowane w
  48. obiekcie uruchamiającym. Obiekt uruchamiający zmienia litery w
  49. nazwie akcji na małe i używa separatorów aby otrzymać nazwę metody
  50. akcji w postaci camelCasing. Jednak z tego powodu, że funkcje PHP
  51. nie są wrażliwe na wielkość liter, <emphasis>mogłeś</emphasis> wciąż
  52. tworzyć adresy w postaci camelCasing, a obiekt uruchamiający wciąż
  53. otrzymywał na ich podstawie nazwę tej samej akcji. Na przykład adres
  54. 'camel-cased' zostałby zamieniony przez obiekt uruchamiający na
  55. 'camelCasedAction', a adres 'camelCased' na 'camelcasedAction';
  56. z tego powodu że PHP nie jest wrażliwe na wielkość liter, w obu
  57. przypadkach zostanie uruchomiona ta sama metoda.
  58. </para>
  59. <para>
  60. Powoduje to problemy w klasie ViewRenderer gdy szuka ona skryptów
  61. widoku. Podstawowym udokumentowanym sposobem jest zastępowanie
  62. wszystkich separatorów wyrazów znakiem podkreślenia oraz zmiana
  63. liter na małe. Wprowadza to niezgodność semantyczną pomiędzy akcjami
  64. a skryptami widoków, a regulacja tego pozwoli na znajdowanie
  65. skryptów widoków w każdej sytuacji. Teraz jeśli wywołamy metodę
  66. 'camelCased', separator wyrazów nie będzie już znajdować się w
  67. nazwie i ViewRenderer spróbuje uruchomić inny plik --
  68. 'camelcased.phtml' zamiast 'camel-cased.phtml'.
  69. </para>
  70. <para>
  71. Niektórzy programiści polegali na tej "funkcjonalności", która nigdy
  72. nie była zamierzona. Wiele zmian w wersji 1.5.0 spowodowało, że
  73. klasa ViewRenderer nie znajduje już plików widoków w taki sposób;
  74. semnatyczna zgodność jest teraz wymuszona. Po pierwsze, obiekt
  75. uruchamiający wymusza teraz wrażliwość na wielkość liter w nazwach
  76. akcji. Oznacza to, że odwoływanie się do akcji używając w adresie
  77. formy camelCasing nie będzie już dłużej prowadzić do tej samej
  78. metody, do której prowadziło odwołanie za pomocą separatorów
  79. wyrazów (np., 'camel-casing'). Teraz klasa ViewRenderer podczas
  80. szukania skryptów widoku akceptuje jedynie formę z separatorami
  81. wyrazów.
  82. </para>
  83. <para>
  84. Jeśli okazało się, że polegałeś na tej "funkcjonalności", masz kilka
  85. rozwiązań:
  86. </para>
  87. <itemizedlist>
  88. <listitem><para>
  89. Najlepsza opcja: zmień nazwy skwoich skryptów wiodku. Plus:
  90. kompatybilność wsteczna. Minus: jeśli masz dużo skryptów
  91. widoku, które polegają na tym niezamierzonym zachowaniu,
  92. możesz mieć dużo plików do zmiany.
  93. </para></listitem>
  94. <listitem>
  95. <para>
  96. Druga najlepsza opcja: klasa ViewRenderer teraz określa
  97. nazwę skryptu widoku za pomocą klasy <code>Zend_Filter_Inflector</code>;
  98. możesz zmodyfikować reguły określania nazwy, aby nie używać
  99. separatorów wyrazów w nazwach akcji.
  100. </para>
  101. <programlisting role="php"><![CDATA[
  102. $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  103. $inflector = $viewRenderer->getInflector();
  104. $inflector->setFilterRule(':action', array(
  105. new Zend_Filter_PregReplace(
  106. '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
  107. ''
  108. ),
  109. 'StringToLower'
  110. ));
  111. ]]>
  112. </programlisting>
  113. <para>
  114. Powyższy kod zmieni sposób określania nazwy skryptu widoku,
  115. aby nie oddzielał słów za pomocą znaku podkreślenia; możesz
  116. także usunać filtr 'StringToLower' jeśli
  117. <emphasis>chcesz</emphasis> używać nazw skryptów widoku
  118. w postaci camelCased.
  119. </para>
  120. <para>
  121. Jeśli zmiana nazw skryptów widoku zajmie zbyt dużo czasu,
  122. najlepszym sposobem będzie tymczasowe użycie powyższego kodu.
  123. </para>
  124. </listitem>
  125. <listitem>
  126. <para>
  127. Najgorsza opcja: Możesz spowodować aby obiekt uruchamiający
  128. uruchamiał akcje w postaci camelCased za pomocą nowej flagi
  129. kontrolera frontowego, 'useCaseSensitiveActions':
  130. </para>
  131. <programlisting role="php"><![CDATA[
  132. $front->setParam('useCaseSensitiveActions', true);
  133. ]]>
  134. </programlisting>
  135. <para>
  136. Pozwoli ci to wciąż używać formy camelCasing w adresach URL
  137. i taie wywołanie będzie uruchamiać tę samą akcję jak podczas
  138. użycia separatorów wyrazów. Jednak oznacza to, że oryginalny
  139. błąd będzie wciąż występował; jeśli nie chcesz aby wystąpiły
  140. problemy, użyj przynajmniej drugiej z przedstawionych opcji.
  141. </para>
  142. <para>
  143. Zauważ też, że użycie tej flagi spowoduje wyświetlenie
  144. informacji o tym, że jej użycie jest przestarzałe.
  145. </para>
  146. </listitem>
  147. </itemizedlist>
  148. </sect2>
  149. <sect2 id="zend.controller.migration.fromzeroninethree">
  150. <title>Migracja z wersji 0.9.3 do 1.0.0RC1 lub nowszej</title>
  151. <para>
  152. Głównymi zmianami, jakie pojawiły się w wersji 1.0.0RC1 jest dodanie
  153. i domyśle włączenie wtyczki <link
  154. linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
  155. oraz pomocniczej klasy akcji <link
  156. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  157. Proszę przeczytaj uważnie dokumentację obu komponentów aby dowiedzieć
  158. się jak one działają i jakie efekty mogą one mieć w twoich aplikacjach.
  159. </para>
  160. <para>
  161. Wtyczka <code>ErrorHandler</code> jest uruchamiana jako metoda
  162. <code>postDispatch()</code> w celu sprawdzenia czy wyrzucone zostały
  163. wyjątki i ewentualnego przeniesienia żądania do określonego kontrolera
  164. obsługi błędów. Powinieneś mieć taki kontroler w swojej aplikacji.
  165. Możesz jednak wyłączyć taką obsługę błędów ustawiając w kontrolerze
  166. frontowym parametr <code>noErrorHandler</code>:
  167. </para>
  168. <programlisting role="php"><![CDATA[
  169. $front->setParam('noErrorHandler', true);
  170. ]]>
  171. </programlisting>
  172. <para>
  173. Pomocnicza klasa akcji <code>ViewRenderer</code> automatyzuje
  174. przekazywanie widoków do kontrolerów akcji oraz automatycznie
  175. renderuje skrypty widoku oparte na nazwie danej akcji. Głównym
  176. problemem jaki możesz napotkać są akcje, które nie renderują
  177. skryptów widoków, nie przekierowują i nie przenoszą żądania, z tego
  178. względu, że klasa <code>ViewRenderer</code> będzie próbować
  179. renderować skrypt widoku oparty na nazwie akcji.
  180. </para>
  181. <para>
  182. Jest kilka strategii które możesz podjąc aby zaktualizować swój kod.
  183. Krótkoterminowo możesz globalnie wyłączyć użycie klasy
  184. <code>ViewRenderer</code> w kontrolerze frontowym w pliku uruchamiającym
  185. przed uruchomieniem żądania:
  186. </para>
  187. <programlisting role="php"><![CDATA[
  188. // Zakładając, że $front jest instancją klasy Zend_Controller_Front
  189. $front->setParam('noViewRenderer', true);
  190. ]]>
  191. </programlisting>
  192. <para>
  193. Jednak długoterminowo nie jest to dobra strategia, ponieważ będziesz
  194. musiał pisać więcej kodu.
  195. </para>
  196. <para>
  197. Kiedy będziesz gotowy do użycia funkcjonalności klasy <code>ViewRenderer</code>,
  198. będzie kilka rzeczy które będziesz musiał sprawdzić w kodzie swoich kontrolerów.
  199. Wpierw spójrz na metody akcji (metody kończące się na 'Action') i
  200. sprawdź co one robią. Będziesz musiał wprowadzić zmiany, jeśli w
  201. metodzie nie jest przeprowadzana żadna z poniższych czynności:
  202. </para>
  203. <itemizedlist>
  204. <listitem><para>Wywołanie metody <code>$this-&gt;render()</code></para></listitem>
  205. <listitem><para>Wywołanie metody <code>$this-&gt;_forward()</code></para></listitem>
  206. <listitem><para>Wywołanie metody <code>$this-&gt;_redirect()</code></para></listitem>
  207. <listitem><para>Wywołanie pomocniczej klasy akcji <code>Redirector</code></para></listitem>
  208. </itemizedlist>
  209. <para>
  210. Najprostszym sposobem jest wyłączenie automatycznego renderowania dla tej metody:
  211. </para>
  212. <programlisting role="php"><![CDATA[
  213. $this->_helper->viewRenderer->setNoRender();
  214. ]]>
  215. </programlisting>
  216. <para>
  217. Jeśli żadna z twoich akcji nie renderuje, nie przenosi i nie
  218. przekierowuje, możesz powyższą linię umieścić w metodzie
  219. <code>preDispatch()</code> lub <code>init()</code>:
  220. </para>
  221. <programlisting role="php"><![CDATA[
  222. public function preDispatch()
  223. {
  224. // wyłączamy automatyczne renderowanie skryptu widoku
  225. $this->_helper->viewRenderer->setNoRender()
  226. // .. robimy coś dalej...
  227. }]]>
  228. </programlisting>
  229. <para>
  230. Jeśli wywołujesz metodę <code>render()</code>,
  231. i używasz <link
  232. linkend="zend.controller.modular">klasycznej modularnej struktury
  233. katalogów</link>,
  234. możesz potrzebować zaktualizować swój kod aby używał automatycznego
  235. renderowania:
  236. </para>
  237. <itemizedlist>
  238. <listitem>
  239. <para>
  240. Jeśli renderujesz wiele skryptów widoków w jednej akcji,
  241. nie musisz nic zmieniać w tej kwestii.
  242. </para>
  243. </listitem>
  244. <listitem>
  245. <para>
  246. Jeśli wywołujesz metodę <code>render()</code> bez argumentów,
  247. możesz po prostu usunąć te wywołania.
  248. </para>
  249. </listitem>
  250. <listitem>
  251. <para>
  252. Jeśli wywołujesz metodę <code>render()</code> używając
  253. argumentów i nie wykonujesz później innego kodu ani nie
  254. renderujesz kolejnych skryptów widoku, możesz zmienić
  255. wywołania aby korzystały z metody o tej samej nazwie, obiektu
  256. <code>$this-&gt;_helper-&gt;viewRenderer()</code>.
  257. </para>
  258. </listitem>
  259. </itemizedlist>
  260. <para>
  261. Jeśli nie używasz klasycznej modularnej struktury katalogów, jest
  262. wiele sposobów ustawienia bazowej ścieżki widoków i specyfikacji
  263. ścieżek skryptów, do czego możesz użyć klasy <code>ViewRenderer</code>.
  264. Proszę przeczytaj <link
  265. linkend="zend.controller.actionhelpers.viewrenderer">dokumentację
  266. klasy ViewRenderer</link> aby uzyskać więcej informacji na
  267. temat tych metod.
  268. </para>
  269. <para>
  270. Jeśli używasz obiektu widoku z rejestru, konfigurujesz swój własny
  271. obiekt lub używasz innej implementacji widoku, możesz przekazać ten
  272. obiekt do obiektu <code>ViewRenderer</code>. Możesz to łatwo zrobić
  273. w dowolnym momencie.
  274. </para>
  275. <itemizedlist>
  276. <listitem>
  277. <para>
  278. Przed uruchomieniem kontrolera frontowego:
  279. </para>
  280. <programlisting role="php"><![CDATA[
  281. // Zakładając, że obiekt $view został już zdefiniowany
  282. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  283. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  284. ]]>
  285. </programlisting>
  286. </listitem>
  287. <listitem>
  288. <para>
  289. W dowolnej chwili podczas procesu ładowania:
  290. </para>
  291. <programlisting role="php"><![CDATA[
  292. $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  293. $viewRenderer->setView($view);
  294. ]]>
  295. </programlisting>
  296. </listitem>
  297. </itemizedlist>
  298. <para>
  299. Jest wiele sposobów na zmodyfikowanie obiektu <code>ViewRenderer</code>,
  300. włączając w to ustawienie innego skryptu widoku do renderowania,
  301. zastąpienie wszystkich części ścieżki skrytu widoku (także przyrostka),
  302. wybranie segmentu obiektu odpowiedzi w którym ma być zrenderowany
  303. i kilka innych. Jeśli nie chcesz używać klasycznej modularnej
  304. struktury katalogów, możesz określić inne specyfikacje ścieżek za
  305. pomocą klasy <code>ViewRenderer</code>.
  306. </para>
  307. <para>
  308. Zalecamy zaadaptowanie w swoim kodzie użycia wtyczki
  309. <code>ErrorHandler</code> oraz pomocniczej klasy akcji
  310. <code>ViewRenderer</code> z tego względu, że te funkcjonalności są
  311. teraz składnikiem jądra.
  312. </para>
  313. </sect2>
  314. <sect2 id="zend.controller.migration.fromzeroninetwo">
  315. <title>Migracja z wersji 0.9.2 do 0.9.3 lub nowszej</title>
  316. <para>
  317. W wersji 0.9.3 pojawiają się <link
  318. linkend="zend.controller.actionhelpers">klasy pomocnicze akcji</link>.
  319. W związku z tym, poniższe metody zostały usunięte, z tego względu, że
  320. teraz są one zawarte w <link
  321. linkend="zend.controller.actionhelpers.redirector">przekierowującej
  322. pomocniczej klasie akcji</link>:
  323. </para>
  324. <itemizedlist>
  325. <listitem>
  326. <para>
  327. <code>setRedirectCode()</code>; użyj
  328. <code>Zend_Controller_Action_Helper_Redirector::setCode()</code>.
  329. </para>
  330. </listitem>
  331. <listitem>
  332. <para>
  333. <code>setRedirectPrependBase()</code>; użyj
  334. <code>Zend_Controller_Action_Helper_Redirector::setPrependBase()</code>.
  335. </para>
  336. </listitem>
  337. <listitem>
  338. <para>
  339. <code>setRedirectExit()</code>; użyj
  340. <code>Zend_Controller_Action_Helper_Redirector::setExit()</code>.
  341. </para>
  342. </listitem>
  343. </itemizedlist>
  344. <para>
  345. Przeczytaj <link linkend="zend.controller.actionhelpers">dokumentację
  346. pomocniczych klas akcji</link> aby uzyskać więcej informacji o tym
  347. jak można pobrać obiekty pomocnicze i jak nimi manipulować, oraz dokumentację
  348. <link linkend="zend.controller.actionhelpers.redirector">przekierowującej
  349. pomocniczej klasy akcji</link> w celu uzyskania informacji o ustawianiu
  350. opcji przekierowania (a także o innych metodach dla przekierowań).
  351. </para>
  352. </sect2>
  353. <sect2 id="zend.controller.migration.fromzerosix">
  354. <title>Migracja z wersji 0.6.0 do 0.8.0 lub nowszej</title>
  355. <para>
  356. Od czasu poprzednich zmian, najbardziej podstawowe użycie
  357. komponentów MVC pozostaje takie same:
  358. </para>
  359. <programlisting role="php"><![CDATA[
  360. Zend_Controller_Front::run('/path/to/controllers');
  361. ]]>
  362. </programlisting>
  363. <para>
  364. Jakkolwiek, struktura katalogów została przebudowana, kilka
  365. komponentów usunięto, kilku innym zmieniono nazwy, a także kilka
  366. dodano. Zmiany to:
  367. </para>
  368. <itemizedlist>
  369. <listitem>
  370. <para>
  371. Klasa <code>Zend_Controller_Router</code> została usunięta
  372. na rzecz rewrite routera.
  373. </para>
  374. </listitem>
  375. <listitem>
  376. <para>
  377. Nazwa klasy <code>Zend_Controller_RewriteRouter</code>
  378. została zmieniona na <code>Zend_Controller_Router_Rewrite</code>
  379. i awansowała ona na standardowy router dostarczany z frameworkiem;
  380. <code>Zend_Controller_Front</code> użyje go domyślnie, jeśli
  381. żaden inny router nie zostanie ustawiony.
  382. </para>
  383. </listitem>
  384. <listitem>
  385. <para>
  386. Nowa klasa trasy doa użycia z rewrite routerem została
  387. przedstawiona, jest to
  388. <code>Zend_Controller_Router_Route_Module</code>; kryje
  389. ona w sobie domyślną trasę używaną przez MVC i wspiera <link
  390. linkend="zend.controller.modular">moduły
  391. kontrolerów</link>.
  392. </para>
  393. </listitem>
  394. <listitem>
  395. <para>
  396. Nazwa klasy <code>Zend_Controller_Router_StaticRoute</code>
  397. została zmieniona na
  398. <code>Zend_Controller_Router_Route_Static</code>.
  399. </para>
  400. </listitem>
  401. <listitem>
  402. <para>
  403. Nazwa klasy <code>Zend_Controller_Dispatcher</code> została
  404. zmieniona na <code>Zend_Controller_Dispatcher_Standard</code>.
  405. </para>
  406. </listitem>
  407. <listitem>
  408. <para>
  409. Zmieniły się argumenty metody
  410. <code>Zend_Controller_Action::_forward()</code>. Sygnatura
  411. wygląda teraz następująco:
  412. </para>
  413. <programlisting role="php"><![CDATA[
  414. final protected function _forward($action, $controller = null, $module = null, array $params = null);
  415. ]]>
  416. </programlisting>
  417. <para>
  418. Parametr <code>$action</code> jest zawsze wymagany; jeśli
  419. kontroler nie jest określony, to brana pod uwagę jest akcja
  420. z obecnego kontrolera. Parametr <code>$module</code> jest
  421. zawsze ignorowany, o ile parametr <code>$controller</code>
  422. nie jest określony. Ostatecznie każdy z parametrów w
  423. tablicy <code>$params</code> będzie dołączony do obiektu
  424. żądania. Jeśli nie potrzebujesz określić kontrolera lub
  425. modułu, ale potrzebujesz przekazać parametry, po prostu
  426. określ te wartości jako null.
  427. </para>
  428. </listitem>
  429. </itemizedlist>
  430. </sect2>
  431. <sect2 id="zend.controller.migration.fromzerotwo">
  432. <title>Migracja z wersji 0.2.0 lub z poprzednich do 0.6.0</title>
  433. <para>
  434. Podstawowy sposób korzystania z komponentów MVC nie zmienił się;
  435. nadal możesz użyć poniższego kodu:
  436. </para>
  437. <programlisting role="php"><![CDATA[
  438. Zend_Controller_Front::run('/path/to/controllers');
  439. ]]>
  440. </programlisting>
  441. <programlisting role="php"><![CDATA[
  442. /* -- utwórz router -- */
  443. $router = new Zend_Controller_RewriteRouter();
  444. $router->addRoute('user', 'user/:username', array('controller' => 'user',
  445. 'action' => 'info'));
  446. /* -- ustawić go w kontrolerze -- */
  447. $ctrl = Zend_Controller_Front::getInstance();
  448. $ctrl->setRouter($router);
  449. /* -- ustawić katalog kontrolerów i uruchomić -- */
  450. $ctrl->setControllerDirectory('/path/to/controllers');
  451. $ctrl->dispatch();
  452. ]]>
  453. </programlisting>
  454. <para>
  455. Zalecamy użycie obiektu odpowiedzi (Response) do łączenia zawartości
  456. i nagłówków. To pozwala na bardziej elastyczne zmiany formatu danych
  457. wyjściowych (na przykład JSON lub XML zamiast XHTML) w twoich
  458. aplikacjach. Domyślnie metoda <code>dispatch()</code> zrenderuje
  459. całą odpowiedź, wyśle nagłówki i całą zawartość. Możesz także
  460. użyć kontrolera frontowego aby zwrócił zawartość za pomocą metody
  461. <code>returnResponse()</code>, a potem zrenderować odpowiedź używając
  462. twojej własnej logiki. Przyszłe wersje kontrolera frontowego mogą
  463. forsować użycie obiektu odpowiedzi przez wyświetlenie danych
  464. wyjściowych.
  465. </para>
  466. <para>
  467. Jest wiele dodatkowych funkcjonalności, które rozszerzają istniejące
  468. API i są one opisane w dokumentacji.
  469. </para>
  470. <para>
  471. Główne zmiany, na które musisz uważać, nastąpiły przy tworzeniu klas
  472. pochodnych komponentów. Te zmiany to:
  473. </para>
  474. <itemizedlist>
  475. <listitem>
  476. <para>
  477. <code>Zend_Controller_Front::dispatch()</code> domyślnie
  478. łapie wyjątki w obiekcie odpowiedzi i nie renderuje ich
  479. aby zapobiec wyświetlaniu ważnych informacji systemowych.
  480. Możesz zmienić to zachowanie na kilka sposobów:
  481. </para>
  482. <itemizedlist>
  483. <listitem>
  484. <para>
  485. Ustaw <code>throwExceptions()</code> w kontrolerze
  486. frontowym:
  487. </para>
  488. <programlisting role="php"><![CDATA[
  489. $front->throwExceptions(true);
  490. ]]>
  491. </programlisting>
  492. </listitem>
  493. <listitem>
  494. <para>
  495. Ustaw <code>renderExceptions()</code> w obiekcie
  496. odpowiedzi:
  497. </para>
  498. <programlisting role="php"><![CDATA[
  499. $response->renderExceptions(true);
  500. $front->setResponse($response);
  501. $front->dispatch();
  502. // lub:
  503. $front->returnResponse(true);
  504. $response = $front->dispatch();
  505. $response->renderExceptions(true);
  506. echo $response;
  507. ]]>
  508. </programlisting>
  509. </listitem>
  510. </itemizedlist>
  511. </listitem>
  512. <listitem><para>
  513. <code>Zend_Controller_Dispatcher_Interface::dispatch()</code>
  514. zamiast tokena dispatchera przyjmuje i zwraca teraz
  515. obiekt <xref linkend="zend.controller.request" />.
  516. </para></listitem>
  517. <listitem><para>
  518. <code>Zend_Controller_Router_Interface::route()</code>
  519. przyjmuje i zwraca obiekt <xref linkend="zend.controller.request" />
  520. zamiast tokena dispatchera.
  521. </para></listitem>
  522. <listitem>
  523. <para>Zmiany w <code>Zend_Controller_Action</code> to:</para>
  524. <itemizedlist>
  525. <listitem><para>
  526. Kontruktor teraz przyjmuje dokładnie trzy argumenty,
  527. <code>Zend_Controller_Request_Abstract $request</code>,
  528. <code>Zend_Controller_Response_Abstract $response</code>,
  529. oraz <code>array $params (opcjonalny)</code>.
  530. <code>Zend_Controller_Action::__construct()</code> używa
  531. ich aby ustawić żądanie, odpowiedź, i właściwości
  532. invokeArgs obiektu i jeśli nadpisujesz konstruktor,
  533. powinieneś je także ustawić. Lepiej jednak użyj
  534. metody <code>init()</code> aby skonfigurować instancję,
  535. ponieważ ta metoda jest wywoływana jako ostatnia akcja
  536. konstruktora.
  537. </para></listitem>
  538. <listitem><para>
  539. Metoda <code>run()</code> nie jest już zdefiniowana jako finalna,
  540. ale nie jest też już używana przez kontroler frontowy;
  541. Jej jedynym celem jest użycie klasy jako kontrolera strony.
  542. Przyjmuje ona teraz dwa opcjonalne argumenty,
  543. <code>Zend_Controller_Request_Abstract $request</code>
  544. oraz <code>Zend_Controller_Response_Abstract $response</code>.
  545. </para></listitem>
  546. <listitem><para>
  547. Akcja <code>indexAction()</code> nie musi być już
  548. zdefiniowana, ale jest zalecana jako domyślna akcja.
  549. To pozwala routerowi RewriteRouter oraz kontrolerom akcji
  550. na określenie innych domyślnych metod akcji.
  551. </para></listitem>
  552. <listitem><para>
  553. Metoda <code>__call()</code> powinna być nadpisana aby
  554. obsłużyć automatycznie niezdefiniowane akcje.
  555. </para></listitem>
  556. <listitem><para>
  557. Metoda <code>_redirect()</code> przyjmuje teraz opcjonalny
  558. drugi argument, kod HTTP, który ma być zwrócony z
  559. przekierowaniem oraz opcjonalny trzeci argument,
  560. <code>$prependBase</code>, który może zdecydować czy
  561. bazowy adres URL zarejestrowany w obiekcie żądania ma być
  562. dodany do adresu URL.
  563. </para></listitem>
  564. <listitem>
  565. <para>
  566. Właściwość <code>_action</code> nie jest już
  567. zdefiniowana. Ta właściwość była obiektem
  568. <code>Zend_Controller_Dispatcher_Token</code>, który
  569. nie istnieje już w aktualnej wersji. Jedynym
  570. zastosowaniem tokena było przechowanie informacji o
  571. zażądanym kontrolerze, akcji i parametrach URL. Te
  572. informacje są teraz dostępne w obiekcie żądania w
  573. taki sposób:
  574. </para>
  575. <programlisting role="php"><![CDATA[
  576. // Pobierz nazwę kontrolera z żądania
  577. // Dotychczas dostęp do niej był za pomocą: $this->_action->getControllerName().
  578. // Poniższy przykład używa metody getRequest(), ale możesz także bezpośrednio
  579. // użyć właściwości $_request; użycie getRequest() jest zalecane ponieważ klasa
  580. // rodzica może nadpisać dostęp do obiektu żądania.
  581. $controller = $this->getRequest()->getControllerName();
  582. // Pobierz nazwę akcji z żądania
  583. // Dotychczas dostęp do niej był za pomocą: $this->_action->getActionName().
  584. $action = $this->getRequest()->getActionName();
  585. // Pobierz parametry z żądania
  586. // To się nie zmieniło; metody _getParams() oraz _getParam() teraz w prosty
  587. // sposób wskazują na obiekt żądania.
  588. $params = $this->_getParams();
  589. $foo = $this->_getParam('foo', 'default'); // pobierz parametr 'foo', używając
  590. // wartości 'default' jako domyślnej
  591. ]]>
  592. </programlisting>
  593. </listitem>
  594. <listitem>
  595. <para>
  596. Metoda <code>noRouteAction()</code> została usunięta.
  597. Aby w poprawny sposób obsługiwać nieistniejące
  598. metody akcji powinieneś przekierować je do domyślnej
  599. akcji używając metody <code>__call()</code>:
  600. </para>
  601. <programlisting role="php"><![CDATA[
  602. public function __call($method, $args)
  603. {
  604. // Jeśli została zażądania nieistniejąca metoda 'Action', żądanie zostanie
  605. // przekazane do domyślnej metody akcji:
  606. if ('Action' == substr($method, -6)) {
  607. return $this->defaultAction();
  608. }
  609. throw new Zend_Controller_Exception('Nieprawdiłowa metoda');
  610. }
  611. ]]>
  612. </programlisting>
  613. </listitem>
  614. </itemizedlist>
  615. </listitem>
  616. <listitem><para>
  617. Akcja <code>Zend_Controller_RewriteRouter::setRewriteBase()</code>
  618. została usunięta. W zamian użyj
  619. <code>Zend_Controller_Front::setBaseUrl()</code>
  620. (lub Zend_Controller_Request_Http::setBaseUrl(), jeśli używasz
  621. tej klasy).
  622. </para></listitem>
  623. <listitem><para>
  624. Interfejs <code>Zend_Controller_Plugin_Interface</code> został
  625. zamieniony na <code>Zend_Controller_Plugin_Abstract</code>.
  626. Wszystkie metody przyjmują i zwracają obiekt
  627. <xref linkend="zend.controller.request" />
  628. zamiast tokena dispatchera.
  629. </para></listitem>
  630. </itemizedlist>
  631. </sect2>
  632. </sect1>