| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 17592 -->
- <!-- Reviewed: no -->
- <sect3 id="zend.controller.router.routes.standard">
- <title>Zend_Controller_Router_Route</title>
- <para>
- <classname>Zend_Controller_Router_Route</classname>
- 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
- <acronym>URL</acronym>
- (de partes estáticas y dinámicas (variables))
- y puede ser iniciada con valores
- predeterminados así como con requisitos
- variables.
- </para>
- <para>
- 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
- <filename>http://domain.com/author/martel</filename>
- para ver la
- información sobre este muchacho "martel". La ruta para esa funcionalidad
- podría
- parecerse a:
- </para>
- <programlisting language="php"><![CDATA[
- $route = new Zend_Controller_Router_Route(
- 'author/:username',
- array(
- 'controller' => 'profile',
- 'action' => 'userinfo'
- )
- );
- $router->addRoute('user', $route);
- ]]></programlisting>
- <para>
- El primer parámetro en el constructor
- <classname>Zend_Controller_Router_Route</classname>
- es una
- definición de ruta que será acompañada de una
- <acronym>URL</acronym>
- .
- Las definiciones de ruta consisten en partes estáticas y dinámicas
- separadas por el caracter
- barra ('/'). Las partes estáticas son simples
- textos:
- <command>author</command>
- . Las partes dinámicas, llamadas
- variables, se marcan anteponiendo dos puntos (:) al nombre
- de la
- variable
- <command>:username</command>
- .
- </para>
- <note>
- <title>Uso de Caracteres</title>
- <para>
- 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
- <acronym>PHP</acronym>
- . En
- implementaciones futuras se podría alterar este comportamiento,
- resultando en
- probables fallos escondidos en su código.
- </para>
- </note>
- <para>
- Este ejemplo de ruta debería ser coincidente cuando apunta su
- navegador a
- <filename>http://domain.com/author/martel</filename>
- , en
- cuyo caso todas sus variables se inyectan al objeto
- <classname>Zend_Controller_Request</classname>
- y quedando accesibles
- en
- <classname>ProfileController</classname>
- . Las variables devueltas
- por este ejemplo pueden ser representadas como el siguiente array
- de
- pares clave/valor:
- </para>
- <programlisting language="php"><![CDATA[
- $values = array(
- 'username' => 'martel',
- 'controller' => 'profile',
- 'action' => 'userinfo'
- );
- ]]></programlisting>
- <para>
- Después,
- <classname>Zend_Controller_Dispatcher_Standard</classname>
- debe invocar al método
- <methodname>userinfoAction()</methodname>
- de su
- clase
- <classname>ProfileController</classname>
- (en el módulo por
- defecto) basado en estos valores. Allí se podrán acceder a todas las
- variables mediante los métodos
- <methodname>Zend_Controller_Action::_getParam()</methodname>
- o
- <methodname>Zend_Controller_Request::getParam()</methodname>
- :
- </para>
- <programlisting language="php"><![CDATA[
- public function userinfoAction()
- {
- $request = $this->getRequest();
- $username = $request->getParam('username');
- $username = $this->_getParam('username');
- }
- ]]></programlisting>
- <para>
- 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
- <acronym>URI</acronym>
- ). La siguiente
- ruta imita más o menos el comportamiento de la ruta del Módulo:
- </para>
- <programlisting language="php"><![CDATA[
- $route = new Zend_Controller_Router_Route(
- ':module/:controller/:action/*',
- array('module' => 'default')
- );
- $router->addRoute('default', $route);
- ]]></programlisting>
- <sect4 id="zend.controller.router.routes.standard.variable-defaults">
- <title>Variables por Defecto</title>
- <para>
- Cada variable en la ruta puede tener una valor por defecto y para
- esto es que se usa el
- segundo parámetro del constructor
- <classname>Zend_Controller_Router_Route</classname>
- . Este
- parámetro es un array con claves representando los nombres de
- variables y con
- valores como los deseados por defecto:
- </para>
- <programlisting language="php"><![CDATA[
- $route = new Zend_Controller_Router_Route(
- 'archive/:year',
- array('year' => 2006)
- );
- $router->addRoute('archive', $route);
- ]]></programlisting>
- <para>
- La ruta de arriba comparará
- <acronym>URL</acronym>
- s como
- <filename>http://domain.com/archive/2005</filename>
- y
- <filename>http://example.com/archive</filename>
- . En este último
- caso la variable year(año) tendrá un valor inicial predeterminado de
- 2006.
- </para>
- <para>
- 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
- <classname>Zend_Controller_Dispatcher_Abstract</classname>
- ).
- Para hacerlos más utilizables, tiene que proporcionar un controlador
- válido y una
- acción válida como la ruta por defecto:
- </para>
- <programlisting language="php"><![CDATA[
- $route = new Zend_Controller_Router_Route(
- 'archive/:year',
- array(
- 'year' => 2006,
- 'controller' => 'archive',
- 'action' => 'show'
- )
- );
- $router->addRoute('archive', $route);
- ]]></programlisting>
- <para>
- Entonces, esta ruta resultará en el dispatch al método
- <methodname>showAction()</methodname>
- de la clase
- <classname>ArchiveController</classname>
- .
- </para>
- </sect4>
- <sect4 id="zend.controller.router.routes.standard.variable-requirements">
- <title>Requerimientos para Variables</title>
- <para>
- Podemos agregar un tercer parámetro al constructor
- <classname>Zend_Controller_Router_Route</classname>
- donde
- podemos establecer los requisitos para las variables. Estas son
- definidas como
- partes de una expresión regular:
- </para>
- <programlisting language="php"><![CDATA[
- $route = new Zend_Controller_Router_Route(
- 'archive/:year',
- array(
- 'year' => 2006,
- 'controller' => 'archive',
- 'action' => 'show'
- ),
- array('year' => '\d+')
- );
- $router->addRoute('archive', $route);
- ]]></programlisting>
- <para>
- Con una ruta definida como la de arriba, el router comparará solo
- cuando la variable año
- contenga datos numéricos, eg.
- <filename>http://domain.com/archive/2345</filename>
- . Una
- <acronym>URL</acronym>
- como
- <filename>http://example.com/archive/test</filename>
- no se
- comparará y en su lugar el control se pasará a la próxima ruta en la
- cadena.
- </para>
- </sect4>
- <sect4 id="zend.controller.router.routes.standard.translated-segments">
- <title>Segmentos Traducidos</title>
- <para>
- 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
- <classname>Zend_Translate</classname>
- )
- mediante una de las siguientes formas:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Ponerlo en el registro con la clave
- <classname>Zend_Translate</classname>
- .
- </para>
- </listitem>
- <listitem>
- <para>
- Setearlo mediante el método estático
- <methodname>Zend_Controller_Router_Route::setDefaultTranslator()</methodname>
- .
- </para>
- </listitem>
- <listitem>
- <para>Pasarlo como cuarto parámetro al constructor.</para>
- </listitem>
- </itemizedlist>
- <para>
- Por defecto, se utilizará el "locale" especificado en la
- instancia
- <classname>Zend_Translate</classname>
- . Para anularlo, debe
- setearlo (como una instancia de
- <classname>Zend_Locale</classname>
- o
- un string local) de una de las siguientes maneras:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Ponerlo en el registro con la clave
- <classname>Zend_Locale</classname>
- .
- </para>
- </listitem>
- <listitem>
- <para>
- Setearlo mediante el método estático
- <methodname>Zend_Controller_Router_Route::setDefaultLocale()</methodname>
- .
- </para>
- </listitem>
- <listitem>
- <para>Pasarlo como cuarto parámetro al constructor.</para>
- </listitem>
- <listitem>
- <para>
- Pasarlo como parámetro
- <command>@locale</command>
- al método de ensamblaje.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Los segmentos traducidos se dividen en dos partes. Los segmentos
- fijos están precedidos
- por un único signo
- <emphasis>@</emphasis>
- , 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
- <command>:@</command>
- . 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.
- </para>
- <note>
- <title>IDs de Mensajes y Archivos de Lenguajes Separados</title>
- <para>
- 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
- <acronym>URL</acronym>
- s seguras, debe
- usar un archivo de idioma separado para los mensajes utilizados
- en la
- ruta.
- </para>
- </note>
- <para>La siguiente es la forma más sencilla para preparar el itinerario
- normal para el uso de
- la traducción del segmento:</para>
- <programlisting language="php"><![CDATA[
- // Prepare el traductor
- $translator = new Zend_Translate('array', array(), 'en');
- $translator->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);
- ]]></programlisting>
- <para>Este ejemplo demuestra el uso de segmentos estáticos:</para>
- <programlisting language="php"><![CDATA[
- // Crear la ruta
- $route = new Zend_Controller_Router_Route(
- '@archive',
- array(
- 'controller' => '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());
- ]]></programlisting>
- <para>Puede usar segmentos dinámicos para crear veriones traducidas
- como del tipo
- módulo-ruta:</para>
- <programlisting language="php"><![CDATA[
- // Crear la ruta
- $route = new Zend_Controller_Router_Route(
- ':@controller/:@action/*',
- array(
- 'controller' => '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'));
- ]]></programlisting>
- <para>También puede mezclar segmentos estáticos y dinámicos:</para>
- <programlisting language="php"><![CDATA[
- // Crear la ruta
- $route = new Zend_Controller_Router_Route(
- '@archive/:@mode/:value',
- array(
- 'mode' => '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'));
- ]]></programlisting>
- </sect4>
- </sect3>
|