# Redirector

## Einführung

Der Redirector Helfer erlaubt die Verwendung eines Redirector Objektes um die Notwendigkeiten der Anwendung für das Umleiten zu einer neuen URL zu erfüllen. Er bietet vielfache Vorteile gegenüber der `_redirect()` Methode. Er ist zum Beispiel fähig seitenweises Verhalten im Redirector Objekt vorzudefinieren oder bietet ein eingebautes `gotoSimple($action, $controller, $module, $params)` Interface ähnlich dem von `Zend_Controller_Action::_forward()`.

Der Redirector hat eine Anzahl von Methoden die verwendet werden können um das Verhalten beim Umleiten zu beeinflussen:

- `setCode()` kann verwendet werden um den HTTP Antwort Code zu setzen der wärend des Umleitens verwendet werden soll.

- `setExit()` kann verwendet werden um ein `exit()` nach einer Umleitung zu erzwingen. Standardmäßig ist dieser `TRUE`.

- `setGotoSimple()` kann verwendet werden um eine Standard URL zu setzen die verwendet wird wenn keine an `gotoSimple()` übergeben wird. Verwendet die API von `Zend_Controller_Action::_forward()`: `setGotoSimple($action, $controller = null, $module = null, array $params = array())`

- `setGotoRoute()` kann verwendet werden um eine URL basierend auf einer registrierten Route zu setzen. Übergeben in einem Array von Schlüssel und Werte Paaren und einem Routernamen, wird die URL anhand des Routertyps und der Definition zusammengebaut.

- `setGotoUrl()` kann verwendet werden um eine Standard URL zu setzen die verwendet wird wenn keine an `gotoUrl()` übergeben wird. Akzeptiert einen einzelnen URL String.

- `setPrependBase()` kann verwendet werden um die Basis URL des Anfrage Objektes einer mit `setGotoUrl()`, `gotoUrl()` oder `gotoUrlAndExit()` definierten URL, voranzustellen.

- `setUseAbsoluteUri()` kann verwendet werden um den Redirector dazu zu zwingen absolute URIs zu verwenden wenn umgeleitet wird. Wenn diese Option gesetzt ist, verwendet Sie den Wert von `$_SERVER['HTTP_HOST']`, `$_SERVER['SERVER_PORT']`, und `$_SERVER['HTTPS']` um eine komplete URI zur, durch eine der Umleitungsmethoden, spezifizierten URL zu erstellen. Diese Option ist standardmäßig ausgeschaltet, kann aber in späteren Releases standardmäßig eingeschaltet sein.

Zusätzlich gibt es eine Reihe von Methoden im Redirector für die Bearbeitung der aktuellen Umleitungen:

- `gotoSimple()` verwendet `setGotoSimple()` (`_forward()`-ähnliche API) um eine URL zu erstellen und eine Umleitung durchzuführen.

- `gotoRoute()` verwendet `setGotoRoute()` (route-assembly) um eine URL zu erstellen und eine Umleitung durchzuführen.

- `gotoUrl()` verwendet `setGotoUrl()` (URL string) um eine URL zu erstellen und eine Umleitung durchzuführen.

Letztendlich kann die aktuelle Umleitungs URL jederzeit festgestellt werden durch Verwendung von `getRedirectUrl()`.

## Beispiel für die grundsätzliche Verwendung

### Optionen setzen

Dieses Beispiel überschreibt diverse Optionen, inklusive dem Setzen des HTTP Statuscodes und dessen Verwendung in der Umleitung ('303'), nicht abbrechen der Umleitung und definieren einer Standard URL die beim Umleiten verwendet wird.

    class SomeController extends Zend_Controller_Action
    {
        /**
         * Redirector - definiert zur Komplettierung des Codes
         *
         * @var Zend_Controller_Action_Helper_Redirector
         */
        protected $_redirector = null;

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

            // Setzt die Standardoptionen für die Umleitung
            // Da das Objekt in der Helferanwendung registriert ist,
            // wird diese für alle Aktionen ab diesem Zeitpunkt relevant
            $this->_redirector->setCode(303)
                              ->setExit(false)
                              ->setGotoSimple("this-action",
                                              "some-controller");
        }

        public function myAction()
        {
            /* Mach was */

            // Umleiten zu einer vorher definierten URL, und einen Ausstieg
            // erzwingen der stattfindet sobald das getan wurde:
            $this->_redirector->redirectAndExit();
            return; // wird nie erreicht
        }
    }

### Standardwerte verwenden

Diese Beispiel nimmt an das die Standardwerte verwendet werden, was bedeutet das jede Umleitung in einem sofortigen `exit()` resultiert.

    // ALTERNATIVES BEISPIEL
    class AlternativeController extends Zend_Controller_Action
    {
        /**
         * Redirector - definiert zur Komplettierung des Codes
         *
         * @var Zend_Controller_Action_Helper_Redirector
         */
        protected $_redirector = null;

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

        public function myAction()
        {
            /* Mach was */

            $this->_redirector
                ->gotoUrl('/my-controller/my-action/param1/test/param2/test2');
            return; // wird nie erreicht da standardmäßig gegangen und beendet wird
        }
    }

### Verwenden von goto()'s _forward() API

`gotoSimple()`'s API entspricht der von `Zend_Controller_Action::_forward()`. Der primäre Unterschied ist das Sie eine URL von den übergebenen Parametern erstellt und das Standardformat `:module/:controller/:action/*` des Standardrouters verwendet. Dann leitet es um statt die Aktion zu verketten.

    class ForwardController extends Zend_Controller_Action
    {
        /**
         * Redirector - definiert zur Komplettierung des Codes
         *
         * @var Zend_Controller_Action_Helper_Redirector
         */
        protected $_redirector = null;

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

        public function myAction()
        {
            /* Mach was */

            // Umleiten zu 'my-action' von 'my-controller' im aktuellen Modul,
            // und verwenden der Parameter param1 => test und param2 => test2
            $this->_redirector->gotoSimple('my-action',
                                           'my-controller',
                                           null,
                                           array('param1' => 'test',
                                                 'param2' => 'test2'
                                                 )
                                           );
        }
    }

### Verwenden von Routen die mit gotoRoute() zusammengebaut wurden

Das folgende Beispiel verwendet die `assemble()` Methode des Router's um eine URL zu erstellen die auf einem assoziativen Array von Parametern basiert das übergeben wurde. Es nimmt an das die folgende Route registriert wurde:

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

Angenommen ein Array hat year auf 206 gesetzt, month auf 4, day auf 24, und id auf 42, dann würde dieses eine URL wie die folgende erstellen: `/blog/2006/4/24/42`.

    class BlogAdminController extends Zend_Controller_Action
    {
        /**
         * Redirector - definiert zur Komplettierung des Codes
         *
         * @var Zend_Controller_Action_Helper_Redirector
         */
        protected $_redirector = null;

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

        public function returnAction()
        {
            /* Mach was */

            // Umleiten zum Blog Archiv. Erstellt die folgende URL:
            // /blog/2006/4/24/42
            $this->_redirector->gotoRoute(
                array('year' => 2006,
                      'month' => 4,
                      'day' => 24,
                      'id' => 42),
                'blogArchive'
            );
        }
    }