Cuando se llama al método [[yii\web\Application::run()|run()]] a través del [script de entrada](structure-entry-scripts.md), lo primero que hace es resolver la petición entrante e instanciar una [accion de controlador](structure-controllers.md) apropiada para gestionar la petición. A este proceso se le llama *routing*.
Enrutamiento y Creación de URLS
===============================
## Resolver una Ruta <a name="resolving-route"></a>
Cuando una aplicación Yii empieza a procesar una URL solicitada, lo primero que hace es convertir la URL en una
[ruta](structure-controllers.md#routes). Luego se usa la ruta para instanciar la
[acción de controlador](structure-controllers.md) correspondiente para gestionar al petición. A este proceso se
le llama *enrutamiento*.
El primer paso el primer paso de routing es convertir la petición entrante una ruta que, tal y como se describe en la sección [Controladores](structure-controllers.md#routes), se usa para dirigirse a una acción de controlador. El método invoca al [gestor de URLs](runtime-url-handling.md) para hacer que la conversión de la petición actual funcione.
El proceso inverso se llama *creación de URLs*, y crea una URL a partir de una ruta dada y unos parámetros de consulta
(query) asociados. Cuando posteriormente se solicita la URL creada, el proceso de enrutamiento puede resolverla y
convertirla en la ruta original con los parámetros asociados.
Por defecto, si la petición entrante contiene un parámetro 'GET' llamado 'r', su valor será considerado como la ruta. Sin embargo, si la [[yii\web\UrlManager::enablePrettyUrl|pretty URL feature]] esta habilitada, se tendrá que hacer más trabajo para determinar la ruta solicitada. Para conocer más detalles, por favor refiérase a la sección [generación y conversión de URLs](runtime-url-handling.md).
La principal pieza encargada del enrutamiento y de la creación de URLs es [[yii\web\UrlManager|URL manager]], que se
registra como el componente de aplicación `urlManager`. El [[yii\web\UrlManager|URL manager]] proporciona el método
[[yii\web\UrlManager::parseRequest()|parseRequest()]] para convertir una petición entrante en una ruta y sus
parámetros asociados y el método [yii\web\UrlManager::createUrl()|createUrl()]] para crear una URL a partir de una
ruta dada y sus parámetros asociados.
En el caso que una ruta no pueda ser determinada, el componente 'petición' lanzará una [[yii\web\NotFoundHttpException]].
Configurando el componente `urlManager` en la configuración de la aplicación, se puede dotar a la aplicación de
reconocimiento arbitrario de formatos de URL sin modificar el código de la aplicación existente. Por ejemplo, se
puede usar el siguiente código para crear una URL para la acción `post/view`:
### Ruta por defecto <a name="default-route"></a>
``` php use yii\helpers\Url;
Si una petición entrante no especifica una ruta, cosa que sucede habitualmente en las paginas de inicio, se usará la ruta especificada por [[yii\web\Application::defaultRoute]]. El valor por defecto de esta propiedad es 'site/index', que hace referencia a la acción 'index' del controlador 'site'. Se puede personalizar esta propiedad en la configuración de aplicación como en el siguiente ejemplo:
// Url::to() llama a UrlManager::createUrl() para crear una URL
$url = Url::to(['post/view', 'id' => 100]);
```
Dependiendo de la configuración de `urlManager`, la URL generada puede asemejarse a alguno de los siguientes (u otro)
formato. Y si la URL creada se solicita posteriormente, se seguirá convirtiendo en la ruta original y los valores de
los parámetros.
```
/index.php?r=post/view&id=100
/index.php/post/100
/posts/100
```
## Formatos de URL <a name="url-formats"></a>
El [[yii\web\UrlManager|URL manager]] soporta dos formatos de URL: el formato predeterminado de URL y el formato URL
amigable (pretty URL).
El formato de URL predeterminado utiliza un parámetro de consulta llamado `r` para representar la ruta y los
parámetros normales de la petición para representar los parámetros asociados con la ruta. Por ejemplo, la URL
`/index.php?r=post/view&id=100` representa la ruta `post/view` y 100 es el valor del parámetro `id` de la consulta.
El formato predeterminado de URL no requiere ningún tipo de configuración para [[yii\web\UrlManager|URL manager]] y
funciona en cualquier configuración de servidor Web.
El formato de URL amigable utiliza la ruta adicional a continuación del nombre del script de entrada (entry script)
para representar la ruta y los parámetros de consulta. Por ejemplo, La ruta en la URL `/index.php/post/100` es
`/post/100` que puede representar la ruta `post/view` y el parámetro de consulta `id` 100 con una
[[yii\web\UrlManager::rules|URL rule]] apropiada. Para poder utilizar el formato de URL amigable, se tendrán que
diseñar una serie de [[yii\web\UrlManager::rules|URL rules]] de acuerdo con el requerimiento actual acerca de como
deben mostrarse las URLs.
Se puede cambiar entre los dos formatos de URL conmutando la propiedad
[[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] del [[yii\web\UrlManager|URL manager]] sin cambiar ningún
otro código de aplicación.
## Enrutamiento <a name="routing"></a>
El Enrutamiento involucra dos pasos. El primero, la petición (request) entrante se convierte en una ruta y sus parámetros
de consulta asociados. En el segundo paso, se crea la correspondiente [acción de controlador](structure-controllers.md)
para la ruta convertida para que gestione la petición.
Cuando se usa el formato predefinido de URL, convertir una petición en una ruta es tan simple como obtener los valores
del parámetro de consulta `GET` llamado `r`.
Cuando se usa el formato de URL amigable, el [[yii\web\UrlManager|URL manager]] examinará las
[[yii\web\UrlManager::rules|URL rules]] registradas para encontrar alguna que pueda convertir la petición en una ruta.
Si no se encuentra tal regla, se lanzará una excepción de tipo [[yii\web\NotFoundHttpException]].
Una vez que la la petición se a convertido en una ruta, es el momento de crear la acción de controlador identificada
por la ruta. La ruta se desglosa en múltiples partes a partir de las barras que contenga. Por ejemplo, `site/index`
será desglosado en `site` e `index`. Cada parte is un ID que puede hacer referencia a un modulo, un controlador o una
acción. Empezando por la primera parte de la ruta, la aplicación, sigue los siguientes pasos para generar
(si los hay), controladores y acciones:
1. Establece la aplicación como el modulo actual.
2. Comprueba si el [[yii\base\Module::controllerMap|controller map]] del modulo actual contiene un ID actual. Si lo
tiene, se creará un objeto controlador de de acuerdo con la configuración del controlador encontrado en el mapa, y
se seguirá el Paso 5 para gestionar la parte restante de la ruta.
3. Comprueba si el ID hace referencia a un modulo listado en la propiedad [[yii\base\Module::modules|modules]] del
módulo actual. Si está listado, se crea un modulo de acuerdo con la configuración encontrada en el listado de
módulos, y se seguirá el Paso 2 para gestionar la siguiente parte de la ruta bajo el contexto de la creación de un
nuevo módulo.
4. Trata el ID como si se tratara de un ID de controlador y crea un objeto controlador. Sigue el siguiente paso con la
parte restante de la ruta.
5. El controlador busca el ID en su [[yii\base\Controller::actions()|action map]]. Si lo encuentra, crea una acción de
acuerdo con la configuración encontrada en el mapa. De otra forma, el controlador intenta crear una acción en linea
definida por un método de acción correspondiente al ID actual.
Si ocurre algún error entre alguno de los pasos anteriores, se lanzará una excepción de tipo
[[yii\web\NotFoundHttpException]], indicando el fallo de proceso de enrutamiento.
Cuando una petición se convierte en una ruta vacía, se usa la llamada *ruta predeterminada*. Por defecto, la ruta
predeterminada es `site/index`, que hace referencia a la acción `index` del controlador `site`. Se puede personalizar
configurando la propiedad [[yii\web\Application::defaultRoute|defaultRoute]] de la aplicación en la configuración de
aplicación como en el siguiente ejemplo:
```php
return[
[
// ...
'defaultRoute'=>'main/index',
];
```
### La ruta `catchAll` <a name="catchall-route"></a>
### Ruta `catchAll` <a name="catchall-route"></a>
A veces, queremos poner una aplicación Web en modo de mantenimiento temporalmente y mostrar la misma pagina de información para todas las peticiones. Hay varias maneras de llevar esta operación a cabo. Pero una de las maneras más simples es configurando la propiedad [[yii\web\Application::catchAll]] como en la siguiente configuración de aplicación:
A veces, se puede querer poner la aplicación Web en modo de mantenimiento temporalmente y mostrar la misma pagina de
información para todas las peticiones. Hay varias maneras de lograr este objetivo. Pero una de las maneras más simples
es configurando la propiedad [[yii\web\Application::catchAll]] como en el siguiente ejemplo de configuración de
aplicación:
```php
return[
[
// ...
'catchAll'=>['site/offline'],
'catchAll'=>['site/offline'],
];
```
La propiedad 'catchAll' debe componerse de un array cuyo primer elemento especifique la ruta, y el resto de elementos(pares de nombre-valor) especifiquen los parámetros que van ligados a la acción.
Con la anterior configuración, se usar la acción `site/offline` para gestionar todas las peticiones entrantes.
Cuando se especifica la propiedad 'catchAll', esta reemplazará cualquier otra ruta resuelta a partir de la petición entrante. Con la anterior configuración, la misma acción 'site/offline' se usará para gestionar todas las peticiones entrantes.
La propiedad `catchAll` debe tener un array cuyo primer elemento especifique una ruta, y el resto de elementos
(pares nombre-valor) especifiquen los parámetros [ligados a la acción](structure-controllers.md#action-parameters).
## Crear una Acción <a name="creating-action"></a>
## Creación de URLs <a name="creating-urls"></a>
Una vez que se determina la ruta solicitada, el siguiente paso es crear el objecto de la acción correspondiente a la ruta.
Yii proporciona un método auxiliar (helper method) [[yii\helpers\Url::to()]] para crear varios tipos de URLs a partir
de las rutas dadas y sus parámetros de consulta asociados. Por ejemplo,
La ruta se desglosa en múltiples partes mediante barras oblicuas '/'. Por ejemplo, 'site/index' será desglosado en 'site' y 'index'. Cada parte es un ID que puede hacer referencia a un modulo, un controlador o una acción.
```php
useyii\helpers\Url;
Empezando por la primera parte de la ruta, la aplicación lleva a cabo los siguientes pasos para crear módulos(si los hay), el controlador y la acción.
// crea una URL para la ruta: /index.php?r=post/index
echoUrl::to(['post/index']);
1. Establece la aplicación como el modulo actual.
2. Comprueba si el [[yii\base\Module::controllerMap|controller map]] del modulo actual contiene un ID actual. Si lo tiene, se creará un objecto controlador de acuerdo con la configuración encontrada en el mapa, y ejecuta el Paso 5 con el resto de partes de la ruta.
3. Comprueba si el ID hace referencia a un modulo de la lista de la propiedad[[yii\base\Module::modules|modules]] del actual modulo. Si es así, se crea un modulo de acuerdo con la configuración encontrada en la lista del modulo, y se ejecuta el Paso 2 con la siguiente parte de la ruta dentro del contexto del modulo recién creado.
4. Trata el ID como un ID de controlador y crea un objeto controlador. Ejecuta el siguiente paso con el resto de la ruta.
5. El controlador busca el ID actual en su [[yii\base\Controller::actions()|action map]]. Si lo encuentra, crea una acción de acuerdo con la configuración encontrada en el mapa. De lo contrario, el controlador intentará crear una acción en linea que esta definida por el método de la acción correspondiente con el ID actual.
// crea una URL para la ruta con parámetros: /index.php?r=post/view&id=100
echoUrl::to(['post/view','id'=>100]);
// crea una URL interna: /index.php?r=post/view&id=100#contentecho
Url::to(['post/view','id'=>100,'#'=>'content']);
// crea una URL absoluta: http://www.example.com/index.php?r=post/index
echoUrl::to(['post/index'],true);
// crea una URL absoluta usando el esquema https: https://www.example.com/index.php?r=post/index
echoUrl::to(['post/index'],'https');
```
Hay que tener en cuenta que en el anterior ejemplo, asumimos que se está usando el formato de URL predeterminado.
Si habilita el formato de URL amigable, las URLs creadas serán diferentes, de acuerdo con las
[[yii\web\UrlManager::rules|URL rules] que se usen.
La ruta que se pasa al método [[yii\helpers\Url::to()]] es context sensitive. Esto quiere decir que puede ser una ruta
*relativa* o una ruta *absoluta* que serán tipificadas de acuerdo con las siguientes reglas:
- Si una ruta es una cadena vacía, se usará la [yii\web\Controller::route|route]] solicitada actualmente.
- Si la ruta no contiene ninguna barra `/`, se considerará que se trata de un ID de acción del controlador actual y se
le antepondrá el valor [[\yii\web\Controller::uniqueId|uniqueId]] del controlador actual.
- Si la ruta no tiene barra inicial, se considerará que se trata de una ruta relativa al modulo actual y se le
antepondrá el valor [[\yii\base\Module::uniqueId|uniqueId]] del modulo actual.
Por ejemplo, asumiendo que el modulo actual es `admin` y el controlador actual es `post`,
```php
useyii\helpers\Url;
// la ruta solicitada: /index.php?r=admin/post/index
echoUrl::to(['']);
// una ruta relativa solo con ID de acción: /index.php?r=admin/post/index
echoUrl::to(['index']);
// una ruta relativa: /index.php?r=admin/post/index
echoUrl::to(['post/index']);
// una ruta absoluta: /index.php?r=post/index
echoUrl::to(['/post/index']);
```
El método [[yii\helpers\Url::to()]] se implementa llamando a los métodos
[[yii\web\UrlManager::createUrl()|createUrl()]] y [[yii\web\UrlManager::createAbsoluteUrl()|createAbsoluteUrl()]] del
[[yii\web\UrlManager|URL manager]]. En las próximas sub-secciones, explicaremos como configurar el
[[yii\web\UrlManager|URL manager]] para personalizar el formato de las URLs generadas.
El método [[yii\helpers\Url::to()]] también soporta la creación de URLs NO relacionadas con rutas particulares.
En lugar de pasar un array como su primer paramento, se debe pasar una cadena de texto. Por ejemplo,
```php
useyii\helpers\Url;
// la URL solicitada actualmente: /index.php?r=admin/post/index
echoUrl::to();
// una URL con alias: http://example.comYii::setAlias('@example', 'http://example.com/');
echoUrl::to('@example');
// una URL absoluta: http://example.com/images/logo.gif
echoUrl::to('/images/logo.gif',true);```
Además del método `to()`,laclaseauxiliar[[yii\helpers\Url]]tambiénproporcionaalgunosotrosmétodosdecreación
deURLs.Porejemplo,
```php
use yii\helpers\Url;
// URL de la página inicial: /index.php?r=site/index
echo Url::home();
// la URL base, útil si la aplicación se desarrolla en una sub-carpeta de la carpeta raíz (root) Web
echo Url::base();
// la URL canónica de la actual URL solicitada// visitar https://en.wikipedia.org/wiki/Canonical_link_element
echo Url::canonical();
// recuerda la actual URL solicitada y la recupera más tarde requestsUrl::remember();
echo Url::previous();
```
## Uso de URLs Amigables <a name="using-pretty-urls"></a>
Para utilizar URLs amigables, hay que configurar el componente `ulrManager` en la configuración de la aplicación como
en el siguiente ejemplo:
```php
[
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'rules' => [
// ...
],
],
],
]
```
La propiedad [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] es obligatoria ya que alterna el formato de URL
amigable. El resto de propiedades son opcionales. Sin embargo, la anterior configuración es la más común.
* [[yii\web\UrlManager::showScriptName|showScriptName]]: esta propiedad determina si el script de entrada debe ser
incluido en las URLs generadas. Por ejemplo, en lugar de crear una URL `/index.php/post/100`, estableciendo la
propiedad con valor true, la URL que se generará sera `/post/100`.
* [[yii\web\UrlManager::enableStrictParsing|enableStrictParsing]]: esta propiedad determina si se habilita la
conversión de petición estricta, si se habilita, la URL solicitada tiene que encajar al menos con uno de las
[[yii\web\UrlManager::rules|rules]] para poder ser tratada como una petición valida, o se lanzará una
[[yii\web\NotFoundHttpException]]. Si la conversión estricta esta deshabilitada, cuando ninguna de las
[[yii\web\UrlManager::rules|rules]] coincida con la URL solicitada, la parte de información de la URL se tratará
como si fuera la ruta solicitada.
* [[yii\web\UrlManager::rules|rules]]: esta propiedad contiene una lista de las reglas que especifican como convertir
y crear URLs. Esta es la propiedad principal con la que se debe trabajar para crear URLs que satisfagan el formato
de un requerimiento particular de la aplicación.
> Nota: Para ocultar el nombre del script de entrada en las URLs generadas, además de establecer el
[[yii\web\UrlManager::showScriptName|showScriptName]] a falso, puede ser necesaria la configuración del servidor Web
para que identifique correctamente que script PHP debe ejecutarse cuando se solicita una URL que no lo especifique.
Si se usa el servidor Web Apache, se puede utilizar la configuración recomendada descrita en la sección de