API компонент системы MVC изменялся от версии к версии. Если вы начали использование Zend Framework с его ранних версий, то следуйте рекомендациям по переводу вашего кода на новую архитектуру, приведенным ниже.
Базовое использование компонент MVC не изменилось:
require_once 'Zend/Controller/Front.php'; Zend_Controller_Front::run('/path/to/controllers');
Тем не менее, структура директорий подверглась пересмотру, некоторые компоненты были удалены, другие добавлены или переименованы. Изменения включают в себя следующее:
Zend_Controller_Router
удален в пользу
использования Rewrite Router.
Zend_Controller_RewriteRouter
переименован в
Zend_Controller_Router_Rewrite
, теперь это
стандартный маршрутизатор, поставляемый с фреймворком.
Zend_Controller_Front
будет использовать его по
умолчанию, если не был установлен другой маршрутизатор.
Внедрен новый класс маршрута для использования с Rewrite
Router - Zend_Controller_Router_Route_Module
.
Он предусматривает маршрут по умолчанию, используемый
компонентами MVC, и поддерживает модули контроллеров.
Zend_Controller_Router_StaticRoute
переименован
в Zend_Controller_Router_Route_Static
.
Zend_Controller_Dispatcher
переименован в Zend_Controller_Dispatcher_Standard
.
Аргументы метода Zend_Controller_Action::_forward()
изменились. Его сигнатура теперь:
final protected function _forward($action, $controller = null, $module = null, array $params = null);
$action
- обязательный аргумент. Если не был определен контроллер, то предполагается, что вызывается действие в текущем контроллере. $module
всегда игнорируется, если не определен контроллер. Все переданные в аргументе $params
параметры будут добавлены в объект запроса. Если вам не нужно передавать контроллер или модуль, но нужно передать параметры, то просто укажите null на месте соответствующих аргументов.
Самые основы использования компонент системы MVC не изменились, следующий код будет корректно выполняться и в версии 0.6.0:
require_once 'Zend/Controller/Front.php'; Zend_Controller_Front::run('/path/to/controllers');
/* -- create a router -- */ $router = new Zend_Controller_RewriteRouter(); $router->addRoute('user', 'user/:username', array('controller' => 'user', 'action' => 'info')); /* -- set it in a controller -- */ $ctrl = Zend_Controller_Front::getInstance(); $ctrl->setRouter($router); /* -- set controller directory and dispatch -- */ $ctrl->setControllerDirectory('/path/to/controllers'); $ctrl->dispatch();
Рекомендуется использовать объект ответа для сбора содержимого и
заголовков. Это предоставляет большую гибкость при переключении
между разными форматами вывода (например, JSON или XML вместо XHTML)
в приложениях. По умолчанию dispatch()
будет выводить
ответ, отправляя заголовки и выводя весь контент. Можно также
сделать так, чтобы фронт-контроллер возвращал ответ, используя метод
returnResponse()
, и затем выводить ответ так, как нужно
вам. Будущая версия фронт-контроллер может принуждать к
использованию объекта ответа посредством буферизации вывода.
Есть также много дополнительных инструментов, расширяющих существующий API, они описаны в этой документации.
Основные изменения, о которых следует знать, касаются расширения существующих компонент. Наиболее важные из них следующие:
Zend_Controller_Front::dispatch()
по умолчанию
отлавливает все исключения в объекте ответа и не отображает
их для предотвращения раскрытия данных о системе. Вы
можете переопределить это поведение несколькими способами:
Установка throwExceptions()
во
фронт-контроллере:
$front->throwExceptions(true);
Установка renderExceptions()
в объекте
ответа:
$response->renderExceptions(true); $front->setResponse($response); $front->dispatch(); // или: $front->returnResponse(true); $response = $front->dispatch(); $response->renderExceptions(true); echo $response;
Zend_Controller_Dispatcher_Interface::dispatch()
теперь принимает и возвращает объект запроса
???
вместо метки Zend_Controller_Dispatcher_Token
.
Zend_Controller_Router_Interface::route()
теперь принимает и возвращает объект ответа
???
вместо метки Zend_Controller_Dispatcher_Token
Среди изменений Zend_Controller_Action
есть
следующие:
Его конструктор теперь включает в себя три аргумента,
Zend_Controller_Request_Abstract $request
,
Zend_Controller_Response_Abstract $response
,
и array $params
(необязательный).
Zend_Controller_Action::__construct()
использует их для установки запроса, ответа и свойств
объекта
Еще лучше использовать метод init()
для
выполнения любого начального конфигурирования, так
как этот метод вызывается в конце конструктора.
Метод run()
теперь не определен с ключевым
словом final, но он также и не используется во
фронт-контроллере; единственным его назначением
является использование класса как контроллера страниц.
Теперь он принимает два необязательных аргумента –
Zend_Controller_Request_Abstract $request
и Zend_Controller_Response_Abstract $response
.
indexAction()
уже не обязателен для
определения, но рекомендуется определять его в качестве
действия по умолчанию. Это позволяет использовать
RewriteRouter и контроллеры для указания различных
методов действий, используемых по умолчанию.
__call()
должен замещаться для обработки
вызовов не определенных в классе действий.
Метод _redirect()
теперь принимает второй
необязательный аргумент, HTTP-код для возвращения при
перенаправлении, и третий необязательный аргумент,
$prependBase
, который указывает, что
базовый URL, зарегистрированный в объекте запроса,
должен предшествовать URL, указанному в первом
аргументе.
Метод
Zend_Controller_RewriteRouter::setRewriteBase()
был
удален. Вместо него используйте
Zend_Controller_Front::setBaseUrl()
(или
Zend_Controller_Request_Http::setBaseUrl(), если используется
объект запроса).
Интерфейс Zend_Controller_Plugin_Interface
заменен
классом Zend_Controller_Plugin_Abstract
. Все его
методы теперь принимают и возвращают
???
вместо метки диспетчеризации.