2012-03-27 13 views
0

Ich baue eine Zend Framework 1.11.11 Anwendung und möchte die Routen und Content-Datenbank getrieben werden.Zend Framework - Router - Erstellen von Aliasen

Ich habe ein FrontController-Plugin geschrieben, das die 'Pfade' aus der Datenbank abruft und für jeden einen Eintrag im Router mit dem zugehörigen Controller und der Aktion erstellt.

Allerdings würde ich gerne "Aliase" verwenden können - eine URL, die sich wie eine normale URL verhält, aber ein Alias ​​ist.

Zum Beispiel, wenn ich erstellen die folgenden:

// Create the Zend Route 
$entry = new Zend_Controller_Router_Route_Static(
    $route->getUrl(), // The string/url to match 
    array('controller' => $route->getControllers()->getName(), 
      'action' => $route->getActions()->getName()) 
);      
// Add the route to the router 
$router->addRoute($route->getUrl(), $entry); 

Dann wird eine Route für /about/ zum Beispiel kann goto der staticController, index.

Aber was ist der beste Weg für mich, einen Alias ​​dieser Route zu erstellen? Also, wenn ich zu /abt/ ging, würde es den gleichen Controller und Action machen?

Für mich ist es nicht sinnvoll, den gleichen Weg zu erstellen, wie werde ich die Strecke wie die Seite ‚Bezeichner‘ verwenden, um dann Last Inhalte aus der Datenbank für die Seite ...

Antwort

1

können Sie erweitern statische Router:

class My_Route_ArrayStatic extends Zend_Controller_Router_Route_Static 
{ 
    protected $_routes = array(); 

    /** 
    * Prepares the array of routes for mapping 
    * first route in array will become primary, all others 
    * aliases 
    * 
    * @param array $routes array of routes 
    * @param array $defaults 
    */ 
    public function __construct(array $routes, $defaults = array()) 
    { 
     $this->_routes = $routes; 
     $route = reset($routes); 
     parent::__construct($route, $defaults); 
    } 

    /** 
    * Matches a user submitted path with a previously specified array of routes 
    * 
    * @param string $path 
    * @param boolean $partial 
    * @return array|false 
    */ 
    public function match($path, $partial = false) 
    { 
     $return = false; 

     foreach ($this->_routes as $route) { 
      $this->setRoute($route); 
      $success = parent::match($path, $partial); 
      if (false !== $success) { 
       $return = $success; 
       break; 
      } 
     } 

     $this->setRoute(reset($this->_routes)); 
     return $return; 
    } 

    public function setRoute($route) 
    { 
     $this->_route = trim($route, '/'); 
    } 
} 

und neue Router auf diese Weise hinzufügen:

$r = My_Route_ArrayStatic(array('about', 'abt'), $defaults); 
+0

Vielen Dank für Ihre Antwort - bitten Sie es mit Kommentaren aktualisieren können? – Sjwdavies

+0

Ich habe einige zusätzliche Kommentare, im Grunde nur Wraps match() -Methode, die erlaubt, $ Pfad gegen Array von URLs –

+0

Dank - dies scheint das gewünschte Ergebnis zu erreichen. Ich würde es begrüßen, wenn Sie Ihre Antwort ausführlicher erklären könnten. – Sjwdavies