7.9. Переход с предыдущих версий
Пред. | Глава 7. Zend_Controller | След.

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

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

### 7.9.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, и поддерживает Раздел 7.7, «Модульная структуры директорий».

- `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.9.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()` теперь принимает и возвращает объект запроса Раздел 7.1.2, «Объект запроса» вместо метки `Zend_Controller_Dispatcher_Token`.

- `Zend_Controller_Router_Interface::route()` теперь принимает и возвращает объект ответа Раздел 7.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`. Все его методы теперь принимают и возвращают Раздел 7.1.2, «Объект запроса» вместо метки диспетчеризации.

Пред. | Уровень выше | След.
7.8. Исключения | Начало | Глава 8. Zend_Date