Ver índice de contenidos del libro

A.14. UrlGeneratorServiceProvider

El proveedor UrlGeneratorServiceProvider proporciona un servicio para poder generar URL a partir del nombre de la ruta.

A.14.1. Parámetros de configuración

Este proveedor no define ningún parámetro de configuración.

A.14.2. Servicios proporcionados

El proveedor proporciona los siguientes servicios:

  • url_generator: se una instancia de la clase UrlGenerator y utiliza el objeto de tipo RouteCollection que proporciona el servicio routes. Este servicio dispone de un método llamado generate() que genera la URL a partir del nombre de la ruta y de los parámetros indicados.

A.14.3. Cómo se registra el proveedor

El siguiente código muestra un ejemplo de cómo registrar este proveedor:

$app->register(new Silex\Provider\UrlGeneratorServiceProvider());

A.14.4. Ejemplos de uso

Genera las URL utilizando el servicio url_generator que proporciona el proveedor, tal y como se muestra en el siguiente ejemplo:

$app->get('/', function () {
    return 'Portada del sitio web';
})
->bind('portada');
 
$app->get('/hola/{nombre}', function ($nombre) {
    return "Hola $nombre!";
})
->bind('hola');
 
$app->get('/menu', function () use ($app) {
    return '<a href="'.$app['url_generator']->generate('portada').'">Inicio</a>'.
           ' | '.
           '<a href="'.$app['url_generator']->generate('hola', array('nombre' => 'Igor')).'">Hola Igor</a>';
});

Desde dentro de una plantilla Twig, este servicio se utiliza de la siguiente manera:

{{ app.url_generator.generate('portada') }}

Si además utilizas el bridge de Twig, podrás utilizar las funciones path() y url():

{{ path('portada') }}
{{ url('portada') }} {# genera la URL absoluta: http://ejemplo.org/ #}
{{ path('hola', {nombre: 'Fabien'}) }}
{{ url('hola', {nombre: 'Fabien'}) }} {# genera la URL absoluta: http://ejemplo.org/hola/Fabien #}

A.14.5. Traits

El trait Silex\Application\UrlGeneratorTrait definido por este proveedor añade los siguientes atajos:

  • path: genera una URL relativa.
  • url: genera una URL absoluta.
$app->path('portada');
$app->url('portada');