5.7. Переход с предыдущих версий

API компонент системы MVC изменялся от версии к версии. Если вы начали использование Zend Framework с его ранних версий, то следуйте рекомендациям по переводу вашего кода на новую архитектуру, приведенным ниже.

5.7.1. Переход с 0.2.0 или более ранних версий к версии 0.6.0

Самые основы использования компонент системы 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, «Объект запроса» вместо метки диспетчеризации.