Zend_Controller_Router_Route
Zend_Controller_Router_Route es la ruta
standard del framework. Combina la facilidad de uso con la flexibilidad
para la definición de rutas. Cada ruta consiste fundamentalmente en el
mapeo de la URL (de partes estáticas y dinámicas (variables)) y puede ser
iniciada con valores predeterminados así como con requisitos variables.
Imaginemos que nuestra aplicación ficticia necesitará algunas páginas
informativas sobre los autores del contenido.
Queremos ser capaces de apuntar nuestro navegador web a
http://domain.com/author/martel para ver la información
sobre este muchacho "martel". La ruta para esa funcionalidad podría
parecerse a:
'profile',
'action' => 'userinfo'
)
);
$router->addRoute('user', $route);
]]>
El primer parámetro en el constructor
Zend_Controller_Router_Route
es una definición de ruta que será acompañada de una URL.
Las definiciones de ruta consisten en partes estáticas y dinámicas
separadas por el caracter barra ('/'). Las partes estáticas son simples
textos: author. Las partes dinámicas, llamadas variables,
se marcan anteponiendo dos puntos (:) al nombre de la variable
:username.
Uso de Caracteres
La implementación actual le permite utilizar cualquier carácter
(salvo una barra) como un identificador de variable, pero se recomienda
encarecidamente que se utilicen sólo caracteres que sean válidos para
identificadores de variables PHP. En implementaciones futuras se
podría alterar este comportamiento, resultando en probables fallos
escondidos en su código.
Este ejemplo de ruta debería ser coincidente cuando apunta su navegador a
http://domain.com/author/martel, en cuyo caso todas sus
variables se inyectan al objeto Zend_Controller_Request
y quedando accesibles en ProfileController.
Las variables devueltas por este ejemplo pueden ser representadas como
el siguiente array de pares clave/valor:
'martel',
'controller' => 'profile',
'action' => 'userinfo'
);
]]>
Después, Zend_Controller_Dispatcher_Standard
debe invocar al método userinfoAction() de su clase
ProfileController (en el módulo por defecto) basado en
estos valores. Allí se podrán acceder a todas las variables mediante
los métodos Zend_Controller_Action::_getParam()
o Zend_Controller_Request::getParam():
getRequest();
$username = $request->getParam('username');
$username = $this->_getParam('username');
}
]]>
La definición de ruta puede contener uno o más caracteres especiales
- un comodín - representado por el símbolo '*'.
Se utiliza para reunir parámetros al igual que el valor de ruta por
defecto del Módulo (var => pares de valores definidos en la URI).
La siguiente ruta imita más o menos el comportamiento de la ruta del
Módulo:
'default')
);
$router->addRoute('default', $route);
]]>
Variables por Defecto
Cada variable en la ruta puede tener una valor por defecto y para
esto es que se usa el segundo parámetro del constructor
Zend_Controller_Router_Route.
Este parámetro es un array con claves representando los nombres de
variables y con valores como los deseados por defecto:
2006)
);
$router->addRoute('archive', $route);
]]>
La ruta de arriba comparará URLs como
http://domain.com/archive/2005 y
http://example.com/archive. En este último caso la
variable year(año) tendrá un valor inicial predeterminado de 2006.
Este ejemplo resultará en inyectar una variable año al objeto
solicitud. Ya que no hay información de enrutamiento presente
(no se define ningún controlador ni parámetros de acción),
la solicitud será enviada al controlador y al método de acción
por defecto (que a la vez ambos están definidos en
Zend_Controller_Dispatcher_Abstract).
Para hacerlos más utilizables, tiene que proporcionar un controlador
válido y una acción válida como la ruta por defecto:
2006,
'controller' => 'archive',
'action' => 'show'
)
);
$router->addRoute('archive', $route);
]]>
Entonces, esta ruta resultará en el dispatch al método
showAction() de la clase
ArchiveController.
Requerimientos para Variables
Podemos agregar un tercer parámetro al constructor
Zend_Controller_Router_Route donde podemos
establecer los requisitos para las variables.
Estas son definidas como partes de una expresión regular:
2006,
'controller' => 'archive',
'action' => 'show'
),
array('year' => '\d+')
);
$router->addRoute('archive', $route);
]]>
Con una ruta definida como la de arriba, el router comparará solo
cuando la variable año contenga datos numéricos, eg.
http://domain.com/archive/2345. Una URL como
http://example.com/archive/test no se comparará y en su
lugar el control se pasará a la próxima ruta en la cadena.
Segmentos Traducidos
El standard de ruta brinda apoyo a la traducción de segmentos.
Para utilizar esta característica, tiene que definir por lo menos
un traductor (una instancia de Zend_Translate)
mediante una de las siguientes formas:
Ponerlo en el registro con la clave
Zend_Translate.
Setearlo mediante el método estático
Zend_Controller_Router_Route::setDefaultTranslator().
Pasarlo como cuarto parámetro al constructor.
Por defecto, se utilizará el "locale" especificado en la instancia
Zend_Translate.
Para anularlo, debe setearlo (como una instancia de
Zend_Locale o un string local) de una de las
siguientes maneras:
Ponerlo en el registro con la clave Zend_Locale.
Setearlo mediante el método estático
Zend_Controller_Router_Route::setDefaultLocale().
Pasarlo como cuarto parámetro al constructor.
Pasarlo como parámetro @locale al método de
ensamblaje.
Los segmentos traducidos se dividen en dos partes.
Los segmentos fijos están precedidos por un único signo
@, y serán traducidos al "locale" actual para el
ensamblaje y se revierten al ID del mensaje cuando se acepte
nuevamente. Los segmentos dinámicos tienen el prefijo :@.
Para el ensamblaje, el parámetro dado será traducido y se insertará
en la posición del parámetro.
Cuando se acepte, el parámetro traducido de la URL volverá al ID
del mensaje nuevamente.
IDs de Mensajes y Archivos de Lenguajes Separados
Ocasionalmente un ID de mensaje que quiere usar en una de sus
rutas ya se utiliza en un view script o en otro lugar.
Para tener pleno control sobre URLs seguras, debe usar
un archivo de idioma separado para los mensajes utilizados en
la ruta.
La siguiente es la forma más sencilla para preparar el itinerario
normal para el uso de la traducción del segmento:
addTranslation(array('archive' => 'archiv',
'year' => 'jahr',
'month' => 'monat',
'index' => 'uebersicht'),
'de');
// Establecer el "locale" actual para el traductor
$translator->setLocale('en');
// Establecerlo como traductor por defecto para las rutas
Zend_Controller_Router_Route::setDefaultTranslator($translator);
]]>
Este ejemplo demuestra el uso de segmentos estáticos:
'archive',
'action' => 'index'
)
);
$router->addRoute('archive', $route);
// Ensamblar la URL en el locale actual por defecto: archive
$route->assemble(array());
// Ensamblar la URL en alemán: archiv
$route->assemble(array());
]]>
Puede usar segmentos dinámicos para crear veriones traducidas como
del tipo módulo-ruta:
'index',
'action' => 'index'
)
);
$router->addRoute('archive', $route);
// Ensamblar la URL en el "locale" por defecto: archive/index/foo/bar
$route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
// Ensamblar la URL en alemán: archiv/uebersicht/foo/bar
$route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
]]>
También puede mezclar segmentos estáticos y dinámicos:
'year'
'value' => 2005,
'controller' => 'archive',
'action' => 'show'
),
array('mode' => '(month|year)'
'value' => '\d+')
);
$router->addRoute('archive', $route);
// Ensamblar la URL en el "locale" por defecto: archive/month/5
$route->assemble(array('mode' => 'month', 'value' => '5'));
// Ensamblar la URL en alemán: archiv/monat/5
$route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));
]]>