ZF2 – ein Cookbook

In 3 Schritten einen URL-Shortener mit dem neuen Zend Framework 2 bauen [Schritt 3]
Kommentare

Über den Event Manager registrieren wir eine Methode onRouteCheckForRedirect(), die bei einem Dispatch-Error Event aufgerufen werden soll. Warum Dispatch-Error? Das ist auf jeden Fall nach dem Routing

Über den Event Manager registrieren wir eine Methode onRouteCheckForRedirect(), die bei einem Dispatch-Error Event aufgerufen werden soll. Warum Dispatch-Error? Das ist auf jeden Fall nach dem Routing und es gibt keinen Match auf einen Controller. Als Option wird die Priorität mit 999 angegeben. Eine hohe Priorität ist notwendig, damit unser Code auf jeden Fall vor dem 404-Handling aufgerufen wird.

Bevor wir zum Implementieren der onRouteCheckForRedirect()-Methode kommen, brauchen wir noch eine Ergänzung im Trim Model. Es gibt nämlich noch keine Methode, die abhängig vom Pfad den Original-URL zurückgibt (Listing 22).

Listing 22

public function getOrigUriByTrimPath($trimPath) 
{
    $rowset = $this->select(array(
        'trim_path' => $trimPath,
    ));

    $entity = $rowset->current();

    if (!$entity) {
        throw new Exception("Could not find row for trim path [$trimPath]");
    }

    return $entity->getOrigUrl();
}

Jetzt können wir auch die onRouteCheckForRedirect() in der Module.php koden (Listing 23).

Listing 23

public function onRouteCheckForRedirect(MvcEvent $e) {
    $uri = $e->getRequest()->getRequestUri();
    $uri = ltrim($uri, '/');
        
    $sm = $e->getApplication()->getServiceManager();
    $model = $sm->get('ZhortyModelTrim');
        
    try {
        $origUri = $model->getOrigUriByTrimPath($uri);
    }
    catch (Exception $ex) {
        return;
    }
        
    $locationHeader = new Location();
    $locationHeader->setUri($origUri);
    $headers = new Headers();
    $headers->addHeader($locationHeader);
    $response = new Response();
    $response->setHeaders($headers);

    $e->setResponse($response);
    $e->stopPropagation();
}

Hier werden ebenfalls weitere use-Statements benötigt:

use ZendHttpHeaderLocation; 
    use ZendHttpHeaders; 
    use ZendHttpPhpEnvironmentResponse; 
    use ZendStdlibHydratorClassMethods; 
    use ZendMvcMvcEvent;

In der Methode selbst passiert eigentlich nicht viel Spektakuläres. Es wird bei einem Treffer ein neues Response-Objekt gebaut und darin ein Location Header mit dem gefundenen Original-URL gesetzt. Diese Response wird an das Event gehängt und von ZF2 verarbeitet. Ein wichtiger Punkt ist noch das Verhindern der anderen Event Listener (404-Handling), die normalerweise jetzt trotzdem noch aufgerufen und unser Response-Objekt wieder überschreiben würden. Mit $e->stopPropagation() kann das erreicht werden.

Fazit

Flexibler ist sie geworden, die neue Version des Zend Frameworks. Am Anfang macht sie aufgrund der strukturellen Änderungen der Core-Komponenten wohl auch etwas mehr Arbeit. Nach kurzer Einarbeitungszeit bemerkt man aber die Vorzüge der Komponentenunabhängigkeit, und es macht richtig Spaß, mit ZF2 zu arbeiten. Trotz der Einfachheit der implementierten Applikation soll dieses Cookbook einen schnellen Einstieg geben, mögliche Hürden direkt verhindern und einen Eindruck vermitteln davon, wie angenehm und vorteilhaft ein Projekt mit ZF2 sein kann.

Im November 2006 startete Jan Burkl als Training & System Engineer bei Zend Technologies in Stuttgart. Heute berät der studierte Informatiker als Senior Solution Consultant für Zend-Geschäftskunden in PHP-Softwareprojekten und ist verantwortlich für deutschsprachige Webinare und Konferenzbeiträge von Zend. Sie möchten auch eine Einladung zu phpcloud.com? Schreiben Sie eine E-Mail an jan@zend.com.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -