[ZF2] HasUrl – Validierung von Routen

hasUrl

hasUrl ?

 

Mittels einer eigenen Viewhelper Klasse “hasUrl” zeige ich Ihnen wie Sie Routen validieren können. An einigen Ecken und Kanten wird es in einer Web-Applikation notwendig die jeweiligen Routen zu validieren, z.B. weil diese dynamisch erzeugt werden. Dies ist z.B. oftmals notwendig, sobald Sie Zend Module via einzelne Module erweitern lassen wollen.

Dazu habe ich einmal einen Beispiel Viewhelper implementiert mit dem Namen “hasUrl”.

 

 

 Vorraussetzungen

Für die Implementation vom ViewHelper benötigen Sie zwei Klassen:

  • ViewHelper-Klasse
  • Factoryklasse (Dient zum injizieren von Router-Objekt)

 

Theorie – Was wird implementiert?

In erster Linie werden Sie eine ViewHelper-Klasse erstellen, die einerseits ein Router Objekt benötigt. Welche Art von Routing Sie einsetzen ist hierbei nicht relevant. Sie werden in der Hinsicht hin sich auf den minimalsten Nenner aller Routing-Klassen beschränken. Damit wird die Validierung von Routingtypen wie Segment, Literal oder sonstigen auf dem gleichen Wege geschehen.

Dazu wird nach injeziertem Router, die assemble Methode des Routers dazu verwendet um zu Validieren ob eine Route existent ist. Normalerweise wirft gerade diese Methode bei einer nicht Existenten Route eine Exception. Dies werden Sie sich mit den beiden Klassen zur Lösung machen, in dem Sie den Viewhelper “hasUrl” implementieren.

 

Theorie – RouterInterface

Jede Routingklasse im ZF2 implementiert das Interface “RouteInterface“. Dieses Interfaces werden Sie für “hasUrl” nutzen, um ein entsprechendes Router-Objekt zu übergeben. Dieses Interface erzwingt, dass übergebende Parameter die Methode “assemble” implementieren muss.

 

Praxis – Implementierung von hasUrl

Als erstes implementieren Sie die eigentliche View-Helper Klasse, dazu implementieren Sie für dieses Beispiel diese Klasse im Namensraum des Modules “Application”. In diesem Beispiel wird der Standardautoloader verwendet.

/**
 * Description of ApplicationHasUrl
 *
 * @author IBeliaev
 */

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;
use Zend\Mvc\Router\RouteInterface ;

class ApplicationHasUrl extends AbstractHelper{

    protected $oRouter;

    public function __construct(RouteInterface  $oRouter) {
        $this->setRouter($oRouter);
    }

    /**
     * Set Router
     * @param RouteInterface  $oRouter
     */
    public function setRouter(RouteInterface  $oRouter){
        $this->oRouter = $oRouter;
        return $this;
    }

    /**
     * Get Router
     * @return \Zend\Mvc\Router\RouteInterface
     */
    public function getRouter(){
        return $this->oRouter;
    }

    public function __invoke($name = null, $params = array(), $options = array()){
        $blHasRoute = $this->validateRoute($name, $params, $options);
        return $blHasRoute;
    }

    protected function validateRoute($sRoute, $params = array(), $options = array()){
        $oRouter = $this->getRouter();
        $options["name"] = $sRoute;
        try{
            $sUri = $oRouter->assemble($params, $options);
            $sResult = true;
        } catch (\Exception $ex) {
            $sResult = false;
        }
        return $sResult;
    }
}

Damit wird in erster Linie schon einmal das ViewHelper Plugin von seiner Struktur bereit gestellt. Noch passiert nichts beim Aufruf unseres Helpers aus einem View. Dazu benötigen Sie noch eine Factoryklasse, welche das Router-Objekt an das HasUrl ViewHelper-Plugin übergeben muss.

Dazu implementieren Sie nun eine Factoryklasse, die genau dieses Objekt an die Viewhelper-Klasse “hasUrl” übergeben soll.

 

namespace Application\View\Helper;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class ApplicationHasUrlFactory implements FactoryInterface{

    public function createService(ServiceLocatorInterface $serviceLocator) {
        /* @var $oSM \Zend\ServiceManager\ServiceManager */
        $oSM = $serviceLocator->getServiceLocator();

        $oRouter = $oSM->get('Router');
        $oHasUrl = new ApplicationHasUrl($oRouter);
        return $oHasUrl;
    }

}

Anschließend muss dieser Viewhelper nur noch in der Modulekonfiguration vom Application-Module hinterlegt werden.

'view_helpers' => array(
	'factories' => array(
		'hasUrl' => 'Application\View\Helper\ApplicationHasUrlFactory',
	),
),

Leave a Reply