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

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

7.13.1. Переход с 0.6.0 на 0.8.0

Базовое использование компонент 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 на месте соответствующих аргументов.

7.13.2. Переход с 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() теперь принимает и возвращает объект запроса ??? вместо метки 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. Все его методы теперь принимают и возвращают ??? вместо метки диспетчеризации.