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á
URL
s 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
URL
s 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'));
]]>