API компонент системы MVC изменялся от версии к версии. Если вы начали использование Zend Framework с его ранних версий, то следуйте рекомендациям по переводу вашего кода на новую архитектуру, приведенным ниже.
Самые основы использования компонент системы 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()
теперь принимает и возвращает объект запроса
Раздел 5.1.2, «Объект запроса»
вместо метки Zend_Controller_Dispatcher_Token
.
Zend_Controller_Router_Interface::route()
теперь принимает и возвращает объект ответа
Раздел 5.1.2, «Объект запроса»
вместо метки 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
. Все его
методы теперь принимают и возвращают
Раздел 5.1.2, «Объект запроса»
вместо метки диспетчеризации.