Zend_Controller-Migration.xml 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. <sect1 id="zend.controller.migration">
  2. <title>Переход с предыдущих версий</title>
  3. <para>
  4. API компонент системы MVC претерпевал изменения со временем. Если вы
  5. начали использование Zend Framework с его ранних версий, то следуйте
  6. приведенным ниже рекомендациям по переносу вашего кода на новую
  7. архитектуру.
  8. </para>
  9. <sect2 id="zend.controller.migration.fromonesixtooneseven">
  10. <title>Переход с 1.6.x на 1.7.0 и более поздние версии</title>
  11. <sect3 id="zend.controller.migration.fromonesixtooneseven.dispatcher">
  12. <title>Изменения в интерфейсе диспетчера</title>
  13. <para>
  14. Пользователи обратили наше внимание на тот факт, что
  15. <code>Zend_Controller_Action_Helper_ViewRenderer</code>
  16. использует не присутствующий в интерфейсе метод из
  17. абстрактного класса диспетчера. Мы добавили
  18. этот метод в интерфейс диспетчера для того,
  19. чтобы гарантировать работу созданного вами диспетчера с
  20. классами, входящими в поставку Zend Framework:
  21. </para>
  22. <itemizedlist>
  23. <listitem><para>
  24. <code>formatModuleName()</code>: должен принимать
  25. необработанное имя контроллера (в том виде, в котором оно
  26. хранится в объекте запроса) и преобразовывать его в имя
  27. класса контроллера, наследующего от
  28. <code>Zend_Controller_Action</code>.
  29. </para></listitem>
  30. </itemizedlist>
  31. </sect3>
  32. </sect2>
  33. <sect2 id="zend.controller.migration.fromoneohtoonesix">
  34. <title>Переход с 1.5.x на 1.6.0 и более поздние версии</title>
  35. <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
  36. <title>Изменения в интерфейсе диспетчера</title>
  37. <para>
  38. Пользователи обратили наше внимание на тот факт, что
  39. <code>Zend_Controller_Front</code> и
  40. <code>Zend_Controller_Router_Route_Module</code> используют
  41. методы диспетчера, которые не определены в его интерфейсе.
  42. Мы добавили следующие три метода в его интерфейс для того,
  43. чтобы гарантировать работу созданного вами диспетчера с
  44. классами, входящими в поставку Zend Framework:
  45. </para>
  46. <itemizedlist>
  47. <listitem><para>
  48. <code>getDefaultModule()</code>: должен возвращать имя
  49. используемого по умолчанию модуля.
  50. </para></listitem>
  51. <listitem><para>
  52. <code>getDefaultControllerName()</code>: должен возвращать
  53. имя используемого по умолчанию контроллера.
  54. </para></listitem>
  55. <listitem><para>
  56. <code>getDefaultAction()</code>: должен возвращать имя
  57. используемого по умолчанию действия.
  58. </para></listitem>
  59. </itemizedlist>
  60. </sect3>
  61. </sect2>
  62. <sect2 id="zend.controller.migration.fromoneohtoonefive">
  63. <title>Переход с 1.0.x на 1.5.0 и более поздние версии</title>
  64. <para>
  65. Хотя основной набор функциональных возможностей остался тем же, и
  66. все документированные возможности не претерпели изменений, есть одна
  67. <emphasis>недокументированная</emphasis> "возможность", которая была
  68. изменена.
  69. </para>
  70. <para>
  71. При написании URL-ов, документированным способом написания имен
  72. действий в формате camelCase является использование разделителей
  73. слов. По умолчанию это '.' или '-', но они могут быть заменены на
  74. другие символы путем настройки диспетчера. Диспетчер внутри себя
  75. приводит имена действий к нижнему регистру и использует эти
  76. разделители слов для "пересборки" имен действий с использованием
  77. формата camelCase. Но из-за того, что функции PHP не чувствительны к
  78. регистру, вы <emphasis>могли</emphasis> по-прежнему писать URL-ы в
  79. формате camelCasе, и результатом был запуск тех же методов
  80. действий. Например, 'camel-cased' должен был преобразовываться
  81. диспетчером в 'camelCasedAction', а 'camelCased' - в
  82. 'camelcasedAction', но из-за нечувствительности PHP к регистру имен
  83. функций в обоих случаях будет произведен вызов одного и того же
  84. метода.
  85. </para>
  86. <para>
  87. Это вызывало проблемы с ViewRenderer при определении имени скрипта
  88. вида. Документированный способ состоит в том, что все разделители
  89. слов преобразуются в тире, и слова приводятся к нижнему регистру.
  90. Это создает семантическую связь между действиями и скриптами видов,
  91. а нормализация гарантирует, что скрипты могут быть найдены. Тем не
  92. менее, если вызывается действие с именем 'camelCased' и благополучно
  93. обработано, то разделитель слов более не присутствует в имени, и
  94. ViewRenderer пытается вызвать другой скрипт вида -
  95. 'camelcased.phtml' вместо 'camel-cased.phtml'.
  96. </para>
  97. <para>
  98. Некоторые разработчики полагались на эту незапланированную
  99. "возможность". Тем не менее, некоторые изменения в дереве 1.5.0,
  100. привели к тому, что ViewRenderer более не ищет такие пути;
  101. семантическая связь теперь усилена. Главное, диспетчер
  102. теперь чувствителен к регистру в именах действий. Это значит, что
  103. ссылка на действие через URL с использованием формата camelCase
  104. не будет приводить к вызову того же метода, что и с использованием
  105. разделителей слов (т.е. 'camel-casing').
  106. </para>
  107. <para>
  108. Если получилось, что вы используете эту "возможность", то в имеете
  109. несколько вариантов решения:
  110. </para>
  111. <itemizedlist>
  112. <listitem><para>
  113. Наилучший вариант: переименуйте ваши скрипты вида. Плюсы:
  114. будущая совместимость. Минусы: если вы имеете много скриптов
  115. вида, которые полагаются на старое, незапланированное
  116. поведение, то вам придется сделать много переименований.
  117. </para></listitem>
  118. <listitem>
  119. <para>
  120. Второй лучший вариант: ViewRenderer теперь делегирует
  121. определение скриптов вида инфлектору
  122. <code>Zend_Filter_Inflector</code>; вы можете изменить
  123. правила инфлектора так, чтобы он более не разделял слова в
  124. имени действия знаком тире:
  125. </para>
  126. <programlisting role="php"><![CDATA[
  127. $viewRenderer =
  128. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  129. $inflector = $viewRenderer->getInflector();
  130. $inflector->setFilterRule(':action', array(
  131. new Zend_Filter_PregReplace(
  132. '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
  133. ''
  134. ),
  135. 'StringToLower'
  136. ));
  137. ]]>
  138. </programlisting>
  139. <para>
  140. Приведенный выше код изменит инфлектор таким образом, чтобы
  141. он более не разделял слова в имени действия знаком тире; вы
  142. можете также убрать фильтр 'StringToLower', если хотите,
  143. чтобы реальные имена скриптов вида тоже были в формате
  144. camelCase.
  145. </para>
  146. <para>
  147. Если переименование скриптов вида слишком утомительно или
  148. требует много времени, то этот вариант будет наилучшим
  149. решением на тот период, пока вы не найдете время на
  150. переименование.
  151. </para>
  152. </listitem>
  153. <listitem>
  154. <para>
  155. Менее желательное решение: Вы можете заставить диспетчер
  156. принимать имена действий в формате camelCase, установив
  157. новый флаг фронт-контроллера 'useCaseSensitiveActions':
  158. </para>
  159. <programlisting role="php"><![CDATA[
  160. $front->setParam('useCaseSensitiveActions', true);
  161. ]]>
  162. </programlisting>
  163. <para>
  164. Это позволит вам использовать camelCase в URL-ах и они будут
  165. приводить к запуску тех действий, что и при использовании
  166. разделителей слов. Тем не менее, это будет означать, что
  167. исходная проблема может повлечь за собой другие; возможно,
  168. вам потребуется также использовать описанный выше второй
  169. вариант, чтобы все работало наверняка.
  170. </para>
  171. <para>
  172. Также заметьте, что использование этого флага приведет к
  173. появлению предупреждения (notice) о том, что его
  174. использование не рекомендуется.
  175. </para>
  176. </listitem>
  177. </itemizedlist>
  178. </sect2>
  179. <sect2 id="zend.controller.migration.fromzeroninethree">
  180. <title>Переход с 0.9.3 на 1.0.0RC1 и более поздние версии</title>
  181. <para>
  182. Основные изменения, появившиеся в 1.0.0RC1 - это добавление
  183. включенного по умолчанию плагина
  184. <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
  185. и помощника действий <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  186. Пожалуйста, прочитайте внимательно документацию к ним, чтобы понять,
  187. как они работают, и как они могут повлиять на работу ваших
  188. приложений.
  189. </para>
  190. <para>
  191. Плагин <code>ErrorHandler</code> производит в методе
  192. <code>postDispatch()</code> проверку на предмет исключений и
  193. переход (forwarding) к определенному контроллеру-обработчику
  194. исключений. Вы можете отключить его путем установки параметра
  195. <code>noErrorHandler</code> во фронт-контроллере:
  196. </para>
  197. <programlisting role="php"><![CDATA[
  198. $front->setParam('noErrorHandler', true);
  199. ]]>
  200. </programlisting>
  201. <para>
  202. Помощник действий <code>ViewRenderer</code> автоматизирует
  203. добавление вида в контроллеры действий и производит авторендеринг
  204. скрипта вида, выбранного по текущему действию. Первая проблема, с
  205. которой вы можете встретиться - у вас есть действия,
  206. которые не производят рендеринг скриптов вида и не производят
  207. переход или перенаправление, поскольку <code>ViewRenderer</code>
  208. будет пытаться запустить скрипт вида, выбранного по имени действия.
  209. </para>
  210. <para>
  211. Есть несколько стратегий, используя которые, вы можете обновить свой
  212. код. В краткострочной перспективе решением может быть глобальное
  213. отключение <code>ViewRenderer</code> во фронт-контроллере до
  214. начала процесса диспетчеризации:
  215. </para>
  216. <programlisting role="php"><![CDATA[
  217. // $front является экземпляром Zend_Controller_Front
  218. $front->setParam('noViewRenderer', true);
  219. ]]>
  220. </programlisting>
  221. <para>
  222. Но в долгосрочной перспективе это не лучшее решение, поскольку
  223. оно означает, что вам в будущем придется писать больше кода.
  224. </para>
  225. <para>
  226. Когда вы будете готовы начать использование функционала
  227. <code>ViewRenderer</code>, то необходимо проверить некоторые места в
  228. коде контроллеров. Первое, просмотрите методы действий (методы,
  229. заканчивающиеся на 'Action') и определите, что делает каждый метод.
  230. Если не происходит ничего из следующего, то нужно произвести
  231. изменения:
  232. </para>
  233. <itemizedlist>
  234. <listitem><para>
  235. Вызов <code>$this-&gt;render()</code>
  236. </para></listitem>
  237. <listitem><para>
  238. Вызов <code>$this-&gt;_forward()</code>
  239. </para></listitem>
  240. <listitem><para>
  241. Вызов <code>$this-&gt;_redirect()</code>
  242. </para></listitem>
  243. <listitem><para>
  244. Вызов помощника действий <code>Redirector</code>
  245. </para></listitem>
  246. </itemizedlist>
  247. <para>
  248. Наиболее легким способом будет отключение авторендеринга в данном
  249. методе:
  250. </para>
  251. <programlisting role="php"><![CDATA[
  252. $this->_helper->viewRenderer->setNoRender();
  253. ]]>
  254. </programlisting>
  255. <para>
  256. Если вы обнаружили, что ни один из методов действий не производит
  257. рендеринг, переход или перенаправление, то, скорее всего, нужно
  258. поместить эту строку в методы
  259. <code>preDispatch()</code> или <code>init()</code>:
  260. </para>
  261. <programlisting role="php"><![CDATA[
  262. public function preDispatch()
  263. {
  264. // отключение авторендеринга скриптов вида
  265. $this->_helper->viewRenderer->setNoRender()
  266. // ... еще код ..
  267. }
  268. ]]>
  269. </programlisting>
  270. <para>
  271. Если вы вызываете <code>render()</code> и используете
  272. <link linkend="zend.controller.modular">определенную соглашением
  273. модульную структуру директорий</link>, то нужно
  274. изменить свой код так, чтобы использовался авторендеринг:
  275. </para>
  276. <itemizedlist>
  277. <listitem>
  278. <para>
  279. Если производится рендеринг нескольких скриптов вида в
  280. одном действии, то не нужно ничего изменять.
  281. </para>
  282. </listitem>
  283. <listitem>
  284. <para>
  285. Если производится простой вызов метода
  286. <code>render()</code> без аргументов, то можете удалить
  287. соответствующие строки.
  288. </para>
  289. </listitem>
  290. <listitem>
  291. <para>
  292. Если вызывается <code>render()</code> с аргументами и не
  293. производится впоследствии каких-либо действий или рендеринга
  294. нескольких скриптов вида, то можно заменить эти вызовы на
  295. чтение <code>$this-&gt;_helper-&gt;viewRenderer()</code>.
  296. </para>
  297. </listitem>
  298. </itemizedlist>
  299. <para>
  300. На тот случай, если вы не используете определенную соглашением
  301. модульную структуру директорий, есть набор методов для
  302. установки базового пути к видам и спецификаций пути ко скрипту,
  303. поэтому вы сможете и в этом случае использовать
  304. <code>ViewRenderer</code>. Информацию об этих методах вы найдете в
  305. <link linkend="zend.controller.actionhelpers.viewrenderer">документации
  306. по ViewRenderer</link>
  307. </para>
  308. <para>
  309. Если вы используете объект вида из реестра, создали свой объект
  310. вида, либо используете другие реализации встроенного, то может
  311. потребоваться добавить этот объект в <code>ViewRenderer</code>. Это
  312. легко можно сделать в любой момент времени.
  313. </para>
  314. <itemizedlist>
  315. <listitem>
  316. <para>
  317. До начала диспетчеризации экземпляра фронт-контроллера:
  318. </para>
  319. <programlisting role="php"><![CDATA[
  320. // Предполагается, что $view уже определен
  321. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  322. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  323. ]]>
  324. </programlisting>
  325. </listitem>
  326. <listitem>
  327. <para>
  328. В любой точке процесса загрузки (bootstrap process):
  329. </para>
  330. <programlisting role="php"><![CDATA[
  331. $viewRenderer =
  332. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  333. $viewRenderer->setView($view);]]>
  334. </programlisting>
  335. </listitem>
  336. </itemizedlist>
  337. <para>
  338. Есть много способов модификации <code>ViewRenderer</code>, включая
  339. установку других скриптов вида для рендеринга, определение замещений
  340. для всех замещаемых элементов пути ко скрипту вида (включая
  341. суффикс), выбор именованного сегмента ответа в качестве
  342. используемого и др. Если вы не используете определенную соглашением
  343. модульную структуру директорий, то можете ассоциировать с
  344. <code>ViewRenderer</code> другие спецификации путей.
  345. </para>
  346. <para>
  347. Рекомендуется адаптировать свой код для использования
  348. <code>ErrorHandler</code> и <code>ViewRenderer</code>, так как
  349. сейчас это лежащий в основе фреймворка функционал.
  350. </para>
  351. </sect2>
  352. <sect2 id="zend.controller.migration.fromzeroninetwo">
  353. <title>Переход с 0.9.2 на 0.9.3 и более поздние версии</title>
  354. <para>
  355. В версии 0.9.3 были добавлены <link
  356. linkend="zend.controller.actionhelpers">помощники действий</link>
  357. (action helpers).
  358. Это изменение включает в себя удаление перечисленных ниже методов
  359. из-за того, что сейчас они инкапсулированы в
  360. <link linkend="zend.controller.actionhelpers.redirector">помощнике
  361. перенаправлений</link> (redirector action helper):
  362. </para>
  363. <itemizedlist>
  364. <listitem>
  365. <para>
  366. <code>setRedirectCode()</code>; используйте
  367. <code>Zend_Controller_Action_Helper_Redirector::setCode()</code>.
  368. </para>
  369. </listitem>
  370. <listitem>
  371. <para>
  372. <code>setRedirectPrependBase()</code>; используйте
  373. <code>Zend_Controller_Action_Helper_Redirector::setPrependBase()</code>.
  374. </para>
  375. </listitem>
  376. <listitem>
  377. <para>
  378. <code>setRedirectExit()</code>; используйте
  379. <code>Zend_Controller_Action_Helper_Redirector::setExit()</code>.
  380. </para>
  381. </listitem>
  382. </itemizedlist>
  383. <para>
  384. Более подробную информацию о том, как извлекать и работать с
  385. объектами действий, читайте в <link
  386. linkend="zend.controller.actionhelpers">документации по помощникам
  387. действий</link>. Об установке опций перенаправления и альтернативных
  388. методах перенаправления читайте в <link
  389. linkend="zend.controller.actionhelpers.redirector">документации по
  390. помощнику перенаправлений</link>.
  391. </para>
  392. </sect2>
  393. <sect2 id="zend.controller.migration.fromzerosix">
  394. <title>Переход с 0.6.0 на 0.8.0 и более поздние версии</title>
  395. <para>
  396. Базовое использование компонент MVC не изменилось:
  397. </para>
  398. <programlisting role="php"><![CDATA[
  399. Zend_Controller_Front::run('/path/to/controllers');
  400. ]]>
  401. </programlisting>
  402. <para>
  403. Тем не менее, структура директорий была подвергнута пересмотру,
  404. некоторые компоненты были удалены, другие добавлены или
  405. переименованы. Изменения включают в себя следующее:
  406. </para>
  407. <itemizedlist>
  408. <listitem>
  409. <para>
  410. <code>Zend_Controller_Router</code> удален в пользу
  411. использования Rewrite Router.
  412. </para>
  413. </listitem>
  414. <listitem>
  415. <para>
  416. <code>Zend_Controller_RewriteRouter</code> переименован в
  417. <code>Zend_Controller_Router_Rewrite</code>, теперь это
  418. стандартный маршрутизатор, поставляемый с фреймворком.
  419. <code>Zend_Controller_Front</code> будет использовать его по
  420. умолчанию, если не был установлен другой маршрутизатор.
  421. </para>
  422. </listitem>
  423. <listitem>
  424. <para>
  425. Добавлен новый класс маршрута для использования с Rewrite
  426. Router - <code>Zend_Controller_Router_Route_Module</code>.
  427. Он включает в себя маршрут по умолчанию, используемый
  428. MVC, и поддерживает <link
  429. linkend="zend.controller.modular">модули
  430. контроллеров</link>.
  431. </para>
  432. </listitem>
  433. <listitem>
  434. <para>
  435. <code>Zend_Controller_Router_StaticRoute</code> переименован
  436. в <code>Zend_Controller_Router_Route_Static</code>.
  437. </para>
  438. </listitem>
  439. <listitem>
  440. <para>
  441. <code>Zend_Controller_Dispatcher</code> переименован в
  442. <code>Zend_Controller_Dispatcher_Standard</code>.
  443. </para>
  444. </listitem>
  445. <listitem>
  446. <para>
  447. Аргументы метода
  448. <code>Zend_Controller_Action::_forward()</code> изменились.
  449. Его сигнатура теперь:
  450. </para>
  451. <programlisting role="php"><![CDATA[
  452. final protected function _forward($action,
  453. $controller = null,
  454. $module = null,
  455. array $params = null);
  456. ]]>
  457. </programlisting>
  458. <para>
  459. <code>$action</code> - обязательный аргумент. Если не был
  460. определен контроллер, то предполагается, что вызывается
  461. действие в текущем контроллере. <code>$module</code> всегда
  462. игнорируется, если не определен контроллер. Все переданные в
  463. аргументе <code>$params</code> параметры будут добавлены в
  464. объект запроса. Если вы не запрашиваете контроллер или
  465. модуль, но нужно передать параметры, то просто укажите null
  466. на месте соответствующих аргументов.
  467. </para>
  468. </listitem>
  469. </itemizedlist>
  470. </sect2>
  471. <sect2 id="zend.controller.migration.fromzerotwo">
  472. <title>Переход с 0.2.0 и более ранних версий на 0.6.0</title>
  473. <para>
  474. Базовое использование компонент системы MVC не изменилось,
  475. следующий код будет корректно выполняться и в версии 0.6.0:
  476. </para>
  477. <programlisting role="php"><![CDATA[
  478. Zend_Controller_Front::run('/path/to/controllers');
  479. ]]>
  480. </programlisting>
  481. <programlisting role="php"><![CDATA[
  482. /* -- создание маршрутизатора -- */
  483. $router = new Zend_Controller_RewriteRouter();
  484. $router->addRoute('user',
  485. 'user/:username',
  486. array('controller' => 'user', 'action' => 'info')
  487. );
  488. /* -- установка его во фронт-контроллере -- */
  489. $ctrl = Zend_Controller_Front::getInstance();
  490. $ctrl->setRouter($router);
  491. /* -- установка директории контроллеров и запуск диспетчеризации -- */
  492. $ctrl->setControllerDirectory('/path/to/controllers');
  493. $ctrl->dispatch();
  494. ]]>
  495. </programlisting>
  496. <para>
  497. Рекомендуется использовать объект ответа для сбора содержимого и
  498. заголовков. Это дает большую гибкость при переключении
  499. между разными форматами вывода (например, JSON или XML вместо XHTML)
  500. в приложениях. По умолчанию <code>dispatch()</code> будет возвращать
  501. ответ, отправляя заголовки и выводя весь контент. Можно также
  502. сделать так, чтобы фронт-контроллер возвращал ответ, используя метод
  503. <code>returnResponse()</code>, и затем выводить ответ так, как нужно
  504. вам. Будущая версия фронт-контроллер может принуждать к
  505. использованию объекта ответа посредством буферизации вывода.
  506. </para>
  507. <para>
  508. Также добавлено много новых функциональных возможностей,
  509. расширяющих существующий API, они описаны в документации.
  510. </para>
  511. <para>
  512. Основные изменения, о которых следует знать, касаются расширения
  513. существующих компонент. Наиболее важные из них следующие:
  514. </para>
  515. <itemizedlist>
  516. <listitem>
  517. <para>
  518. <code>Zend_Controller_Front::dispatch()</code> по умолчанию
  519. отлавливает все исключения в объекте ответа и не отображает
  520. их для предотвращения раскрытия данных о системе. Вы
  521. можете переопределить это поведение несколькими способами:
  522. </para>
  523. <itemizedlist>
  524. <listitem>
  525. <para>
  526. Установка <code>throwExceptions()</code> во
  527. фронт-контроллере:
  528. </para>
  529. <programlisting role="php"><![CDATA[
  530. $front->throwExceptions(true);
  531. ]]>
  532. </programlisting>
  533. </listitem>
  534. <listitem>
  535. <para>
  536. Установка <code>renderExceptions()</code> в объекте
  537. ответа:
  538. </para>
  539. <programlisting role="php"><![CDATA[
  540. $response->renderExceptions(true);
  541. $front->setResponse($response);
  542. $front->dispatch();
  543. // или:
  544. $front->returnResponse(true);
  545. $response = $front->dispatch();
  546. $response->renderExceptions(true);
  547. echo $response;
  548. ]]>
  549. </programlisting>
  550. </listitem>
  551. </itemizedlist>
  552. </listitem>
  553. <listitem><para>
  554. <code>Zend_Controller_Dispatcher_Interface::dispatch()</code>
  555. теперь принимает и возвращает объект запроса
  556. <xref linkend="zend.controller.request" />
  557. вместо метки <code>Zend_Controller_Dispatcher_Token</code>.
  558. </para></listitem>
  559. <listitem><para>
  560. <code>Zend_Controller_Router_Interface::route()</code>
  561. теперь принимает и возвращает объект ответа
  562. <xref linkend="zend.controller.request" />
  563. вместо метки <code>Zend_Controller_Dispatcher_Token</code>
  564. </para></listitem>
  565. <listitem>
  566. <para>
  567. Изменения <code>Zend_Controller_Action</code> включают в
  568. себя следующие:
  569. </para>
  570. <itemizedlist>
  571. <listitem><para>
  572. Его конструктор теперь включает в себя три аргумента:
  573. <code>Zend_Controller_Request_Abstract $request</code>,
  574. <code>Zend_Controller_Response_Abstract $response</code>
  575. и <code>array $params</code> (необязательный).
  576. <code>Zend_Controller_Action::__construct()</code>
  577. использует их для установки запроса, ответа и свойств
  578. объекта (аргументов вызова); переопределяя конструктор,
  579. вам следует реализовать те же операции.
  580. Но лучше использовать метод <code>init()</code> для
  581. выполнения любого конфигурирования экземпляра класса,
  582. так как этот метод вызывается в конце конструктора.
  583. </para></listitem>
  584. <listitem><para>
  585. Метод <code>run()</code> теперь не определен с ключевым
  586. словом <code>final</code>, но он также и не используется
  587. во фронт-контроллере; единственным его назначением
  588. является использование класса как контроллера страниц.
  589. Теперь он принимает два необязательных аргумента –
  590. <code>Zend_Controller_Request_Abstract $request</code>
  591. и <code>Zend_Controller_Response_Abstract $response</code>.
  592. </para></listitem>
  593. <listitem><para>
  594. <code>indexAction()</code> уже не обязателен для
  595. определения, но все же рекомендуется определять его в
  596. качестве действия по умолчанию. Это позволяет
  597. использовать RewriteRouter и контроллеры действий для
  598. указания других используемых по умолчанию методов
  599. действий.
  600. </para></listitem>
  601. <listitem><para>
  602. <code>__call()</code> должен переопределяться для
  603. автоматической обработки вызовов действий, не
  604. определенных в классе контроллера.
  605. </para></listitem>
  606. <listitem><para>
  607. Метод <code>_redirect()</code> теперь принимает второй
  608. необязательный аргумент, HTTP-код, который должен
  609. возвращаться при перенаправлении, и третий
  610. необязательный аргумент, <code>$prependBase</code>,
  611. который указывает, что базовый URL, зарегистрированный в
  612. объекте запроса, должен предшествовать URL, переданному
  613. в первом аргументе.
  614. </para></listitem>
  615. <listitem>
  616. <para>
  617. Свойство <code>_action</code> больще не
  618. устанавливается. Это свойство было объектом класса
  619. <code>Zend_Controller_Dispatcher_Token</code>,
  620. которй больше не существует в текущем воплощении.
  621. Единственным назначением метки (token) было
  622. предоставление информации о запрошенных контроллере,
  623. действии и параметрах URL. Эта информация теперь
  624. доступна в объекте запроса, и доступ к ней можно
  625. получить следующим образом:
  626. </para>
  627. <programlisting role="php"><![CDATA[
  628. // Извлечение имени запрошенного контроллера
  629. // Ранее доступ был через $this->_action->getControllerName().
  630. // Пример ниже использует getRequest(), хотя вы можете обращаться напрямую
  631. // ко свойству $_request; рекомендуется использовать getRequest(), поскольку
  632. // родительский класс может переопределить доступ к объекту запроса.
  633. $controller = $this->getRequest()->getControllerName();
  634. // Извлечение имени запрошенного действия
  635. // Ранее доступ был через $this->_action->getActionName().
  636. $action = $this->getRequest()->getActionName();
  637. // Извлечение параметров запроса
  638. // Оно не изменилось; _getParams() и _getParam() просто вызывают аналогичные
  639. // методы объекта запроса
  640. $params = $this->_getParams();
  641. // запрашивается параметр 'foo', если параметр не найден,
  642. // то используется значение по умолчанию 'default'
  643. $foo = $this->_getParam('foo', 'default');]]>
  644. </programlisting>
  645. </listitem>
  646. <listitem>
  647. <para>
  648. Удален метод <code>noRouteAction()</code>.
  649. Подходящим способом обработки несуществующих методов
  650. действий будет перенаправление к действию по
  651. умолчанию через <code>__call()</code>:
  652. </para>
  653. <programlisting role="php"><![CDATA[
  654. public function __call($method, $args)
  655. {
  656. // Если запрошен несуществующий метод действия, то вызывается метод
  657. // действия по умолчанию:
  658. if ('Action' == substr($method, -6)) {
  659. return $this->defaultAction();
  660. }
  661. throw new Zend_Controller_Exception('Invalid method called');
  662. }
  663. ]]>
  664. </programlisting>
  665. </listitem>
  666. </itemizedlist>
  667. </listitem>
  668. <listitem><para>
  669. Удален метод
  670. <code>Zend_Controller_RewriteRouter::setRewriteBase()</code>.
  671. Вместо него используйте
  672. <code>Zend_Controller_Front::setBaseUrl()</code> (или
  673. <code>Zend_Controller_Request_Http::setBaseUrl()</code>,
  674. если используется класс запроса).
  675. </para></listitem>
  676. <listitem><para>
  677. <code>Zend_Controller_Plugin_Interface</code> был заменен на
  678. <code>Zend_Controller_Plugin_Abstract</code>. Все методы теперь
  679. принимают и возвращают объект ответа
  680. <xref linkend="zend.controller.request" /> вместо метки
  681. диспетчеризации.
  682. </para></listitem>
  683. </itemizedlist>
  684. </sect2>
  685. </sect1>
  686. <!--
  687. vim:se ts=4 sw=4 et:
  688. -->