# Redirector

## Введение

Помощник `Redirector` позволяет использовать объект Redirector для удовлетворения нужд в перенаправлении на новые URL. Он имеет многие преимущества по сравнению с методом `_redirect()`, такие, как возможность предварительной конфигурации поведения на стороне сайта в объекте Redirector или использование встроенного интерфейса `gotoSimple($action, $controller, $module, $params)`, подобного интерфейсу `Zend_Controller_Action::_forward()`.

`Redirector` имеет набор методов, которые могут использоваться для управления поведением при перенаправлении:

- `setCode()` может использоваться для установки кода ответа HTTP, используемого при перенаправлении.

- `setExit()` может использоваться для установки принудительного вызова `exit()` после перенаправления. По умолчанию он установлен в true.

- `setGotoSimple()` может использоваться для установки URL, используемого по умолчанию, если методу `gotoSimple()` не был передан URL. Использует интерфейс `Zend_Controller_Action::_forward()`: setGotoSimple($action, $controller = null, $module = null, array $params = array());

- `setGotoRoute()` может использоваться для установки URL, основываясь на зарегистрированном маршруте. Ему должен передаваться массив пар ключ/значение и имя маршрута, из них будет собран URL в соответствии с типом и определением маршрута.

- `setGotoUrl()` может использоваться для установки URL, используемого по умолчанию, если методу `gotoUrl()` не был передан URL. Принимает единственную строку URL в качестве аргумента.

- `setPrependBase()` может использоваться для добавления базового URL объекта запроса в начало URL, заданного через методы `setGotoUrl()`, `gotoUrl()`, или `gotoUrlAndExit()`.

- `setUseAbsoluteUri()` может использоваться для принуждения `Redirector`-а применять абсолютные URI при произведении перенаправления. Когда эта опция установлена, то используются значения `$_SERVER['HTTP_HOST']`, `$_SERVER['SERVER_PORT']` и `$_SERVER['HTTPS']` для формирования полного URI из URL, определенного одним из методов перенаправления. Эта опция по умолчанию отключена, но может быть включена по умолчанию в последующих релизах.

Кроме этого, в Redirector есть различные методы, выполняющие текущие перенаправления:

- `gotoSimple()` использует `setGotoSimple()` (интерфейс, подобный `_forward()`) для построения URL и перенаправления на него.

- `gotoRoute()` использует `setGotoRoute()` (сборка маршрута) для построения URL и перенаправления на него.

- `gotoUrl()` использует `setGotoUrl()` (строка URL) для построения URL и перенаправления на него.

Наконец, можно в любое время получить текущий URL для перенаправления, используя `getRedirectUrl()`.

## Базовые примеры использования

### Опции настройки

В этом примере переопределяются несколько опций, включая код статуса HTTP, используемого при перенаправлении (303), и определение URL, используемое по умолчанию при перенаправлении.

    class SomeController extends Zend_Controller_Action
    {
        /**
         * Редиректор - определен для полноты кода
         *
         * @var Zend_Controller_Action_Helper_Redirector
         */
        protected $_redirector = null;

        public function init()
        {
            $this->_redirector = $this->_helper->getHelper('Redirector');

            // Установка опций по умолчанию для редиректора
            // Поскольку объект зарегистрирован в брокере помощников,
            // то эти опции будут действительными для всех
            // последующих действий
            $this->_redirector->setCode(303)
                              ->setExit(false)
                              ->setGotoSimple("this-action",
                                              "some-controller");
        }

        public function myAction()
        {
            /* делаем что-то */

            // Перенаправление на ранее зарегистрированный URL и
            // принудительное завершение исполнения скрипта:
            $this->_redirector->redirectAndExit();
            return; // никогда не будет достигнуто
        }
    }

### Использование по умолчанию

Этот пример предполагает, что используются значения по умолчанию, это означает, что после любых перенаправлений будет производиться выход `exit()`.

    // АЛЬТЕРНАТИВНЫЙ ПРИМЕР
    class AlternativeController extends Zend_Controller_Action
    {
        /**
         * Редиректор - определен для полноты кода
         *
         * @var Zend_Controller_Action_Helper_Redirector
         */
        protected $_redirector = null;

        public function init()
        {
            $this->_redirector = $this->_helper->getHelper('Redirector');
        }

        public function myAction()
        {
            /* делаем что-то */

            $this->_redirector
                ->gotoUrl('/my-controller/my-action/param1/test/param2/test2');
            // это место никогда не будет достигнуто,
            // т.к. по умолчанию производится переход и завершение выполнения
            return;
        }

### Использование интерфейса _forward() для gotoSimple()

Метод `gotoSimple()` копирует интерфейс метода `Zend_Controller_Action::_forward()`. Основное отличие состоит в том, что он строит URL из переданных параметров и использует формат `:module/:controller/:action/*` маршрутизатора по умолчанию. Затем он производит перенаправление вместо добавления действия в цепочку.

    class ForwardController extends Zend_Controller_Action
    {
        /**
         * Редиректор - определен для полноты кода
         *
         * @var Zend_Controller_Action_Helper_Redirector
         */
        protected $_redirector = null;

        public function init()
        {
            $this->_redirector = $this->_helper->getHelper('Redirector');
        }

        public function myAction()
        {
            /* Делаем что-то */

            // Перенаправление на действие 'my-action' контроллера 'my-controller'
            // в текущем модуле с использованием параметров param1 => test и
            // param2 => test2
            $this->_redirector->gotoSimple('my-action',
                                           'my-controller',
                                           null,
                                           array('param1' => 'test',
                                                 'param2' => 'test2'
                                                 )
                                           );
        }
    }

### Использование маршрута с gotoRoute()

Следующий пример использует метод `assemble()` маршрута для создания URL, основанного на переданном ассоциативном массиве параметров. Этот пример предполагает, что был зарегистрирован следующий маршрут:

    $route = new Zend_Controller_Router_Route(
        'blog/:year/:month/:day/:id',
        array('controller' => 'archive',
              'module' => 'blog',
              'action' => 'view')
    );
    $router->addRoute('blogArchive', $route);

При заданном массиве, в котором year (год), month (месяц), и day (день) установлены в 2006, 4 и 24 соответственно, будет построен URL `/blog/2006/4/24/42`.

    class BlogAdminController extends Zend_Controller_Action
    {
        /**
         * Редиректор - определен для полноты кода
         *
         * @var Zend_Controller_Action_Helper_Redirector
         */
        protected $_redirector = null;

        public function init()
        {
            $this->_redirector = $this->_helper->getHelper('Redirector');
        }

        public function returnAction()
        {
            /* делаем что-то */

            // Перенаправление в архив блога. Строит URL
            // /blog/2006/4/24/42

            $this->_redirector->gotoRoute(
                array('year' => 2006,
                      'month' => 4,
                      'day' => 24,
                      'id' => 42),
                'blogArchive'
            );
        }
    }