2009-04-27 11 views
11

Wie kann ich die Definition meiner benutzerdefinierten Routen in Zend Framework kürzen? Ich habe dies derzeit als Definition:Kürzen Zend Framework Route Definitionen

$route = new Zend_Controller_Router_Route(
    ":module/:id", 
    array(
     "controller" => "index", 
     "action" => "index" 
    ), 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutOne', $route); 

$route = new Zend_Controller_Router_Route(
    ":module/:controller/:id", 
    array("action" => "index"), 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutTwo', $route); 

$route = new Zend_Controller_Router_Route(
    ":module/:controller/:action/:id", 
    null, 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutThree', $route); 

Gibt es eine Möglichkeit, diese Regeln besser zu kombinieren? Und was sind Ihre besten Praktiken, um diese zu platzieren? Ich habe sie momentan in meiner Bootstrap-Klasse direkt nach der Front-Controller-Initialisierung.

Antwort

6

Wenn es darum geht, solche Routen einzurichten, verwende ich eine Konfigurationsdatei. Als Präferenz verwende ich XML, um meine Konfigurationsdaten zu speichern, diese könnten jedoch genauso leicht in einem anderen unterstützten Format gespeichert werden. Ich füge dann die Routen von der Config zu dem Router in meinem Bootstrap hinzu.

Config:

<config> 
    <routes> 
     <shortcutone type="Zend_Controller_Router_Route"> 
      <route>:module/:id</route> 
      <defaults> 
       <controller>index</controller> 
       <action>index</action> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcutone> 
     <shortcuttwo type="Zend_Controller_Router_Route"> 
      <route>:module/:controller/:id</route> 
      <defaults> 
       <controller>index</controller> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcuttwo> 
     <shortcutthree type="Zend_Controller_Router_Route"> 
      <route>:module/:controller/:action/:id</route> 
      <defaults> 
       <controller>index</controller> 
       <action>index</action> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcutthree> 
    </routes> 
</config> 

Bootstrap

$config = new Zend_Config_Xml('config.xml'); 
$router = Zend_Controller_Front::getInstance()->getRouter(); 
$router->addConfig($config, 'routes'); 

Offensichtlich gibt es andere Optionen, und ich würde empfehlen Ihnen, die documentation auf, dies zu lesen, aber diese für Ihre passt Beispiel.

+0

Danke. Ich werde die Config dann verwenden, um meinen Bootstrap schlank zu halten :) –

8

Meine routes.ini-Datei begann sehr groß zu werden, also entschied ich mich, Zend Caching zu verwenden, um die Routen zu cachen, nachdem sie geparst wurden. Ich habe Xcache für die Backend-Caching-Lösung verwendet. Hier ist der Code, der in der Bootstrap.php Datei gesetzt werden sollte:

 
protected function _initRoutes() 
{ 
    $backendType = 'Xcache'; 
    $backendOptions = array(); 

    // Instantiate a caching object for caching the routes 
    $cache = Zend_Cache::factory('File', $backendType, 
    array(
     'automatic_serialization' => true, 
     'master_files'=>array(APPLICATION_PATH . '/configs/routes.ini') 
    ), 
    $backendOptions 
); 

    $frontController = Zend_Controller_Front::getInstance();   

    if(! $router = $cache->load('router')) { 

    // Load up .ini file and put the results in the cache 
    $routes = new Zend_Config_Ini (APPLICATION_PATH . '/configs/routes.ini', 'production');    
    $router = $frontController->getRouter(); 
    $router->addConfig($routes, 'routes'); 

    $cache->save($router, 'router'); 
    }  
    else {   
    // Use cached version 
    $frontController->setRouter($router); 
    } 

} 
+0

Hallo, ich frage mich, wie Sie das Router-Objekt zwischenspeichern können, da es FrontController behandelt, die selbst PDOConnection behandeln, die nicht serialisierbar sind ... – Trent

7

Ich ziehe es ini-Dateien über XMLs besonders zu verwenden, wenn Zend verwenden, da es mehr Zend artig und viel mehr leicht und kompakt . Hier ist eine fast ähnliche Konfiguration mit Zend_Config_Ini().

application.ini

[routes] 
routes.shortcutone.route=:module/:id 
routes.shortcutone.defaults.controller=index 
routes.shortcutone.defaults.action=index 
routes.shortcutone.reqs=\d+ 

bootstrap.php

$config = new Zend_Config_Ini('application.ini', 'routes'); 
$router = Zend_Controller_Front::getInstance()->getRouter(); 
$router->addConfig($config, 'routes'); 

Beachten Sie, dass der [routes] Abschnitt in der application.ini Datei umbenannt werden. Und wenn es umbenannt wird, sollte der zweite Parameter von Zend_Config_Ini() den neuen Abschnittstitel wiedergeben.

+3

'routes.shortcutone.reqs. id = \ d + '? –