2009-04-27 16 views
11

¿Cómo puedo acortar la definición de mis rutas personalizadas en Zend Framework? Actualmente tengo esto como definición:Acortar las definiciones de ruta de Zend Framework

$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); 

¿Hay alguna manera de combinar mejor estas reglas? ¿Y cuáles son sus mejores prácticas en dónde colocarlos? Actualmente los tengo en mi clase de arranque justo después de la inicialización del controlador frontal.

Respuesta

6

Cuando se trata de configurar rutas como esta, utilizo un archivo de configuración. Como preferencia, uso XML para almacenar mis datos de configuración, sin embargo, estos podrían almacenarse fácilmente en otro formato compatible. Luego agrego las rutas desde la configuración, al enrutador en mi arranque.

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'); 

Obviamente, hay otras opciones y os animo a leer el documentation en esto, sin embargo, esto se ajusta para su ejemplo.

+0

Gracias. Utilizaré la configuración para mantener mi Bootstrap slim :) –

8

Mi archivo routes.ini comenzó a ser realmente grande, así que decidí usar Zend Caching para almacenar en caché las rutas después de que se hubieran analizado. Usé Xcache para la solución de almacenamiento en caché de back-end. Aquí está el código, que debe ser puesto en el archivo Bootstrap.php:

 
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

hola, me pregunto cómo podría caché el objeto enrutador ya que maneja FrontController que maneja PDOConnection que no son serializables ... – Trent

7

Yo prefiero usar archivos * .ini sobre XMLs especialmente cuando se utiliza Zend ya que es más similar a Zend y mucho más ligero y compacto . Aquí hay una configuración casi similar usando 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'); 

toman nota de que la sección [routes] en el archivo application.ini puede cambiar el nombre. Y cuando se renombra, el segundo parámetro de Zend_Config_Ini() debe reflejar el nuevo título de sección.

+3

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