Más con Symfony

13.6. Generando URL

Cuando se crean emails es habitual generar URL que dependen de la configuración del enrutamiento. Afortunadamente la generación de URL también se ha simplificado al máximo en Symfony 1.3 porque dentro de una tarea puedes acceder directamente al enrutamiento de la aplicación actual con el método sfCommandApplicationTask::getRouting():

public function execute($arguments = array(), $options = array())
{
  $routing = $this->getRouting();
}

Nota Como el enrutamiento depende de la aplicación, debes asegurarte de que la tarea tenga acceso a la configuración de la aplicación, ya que de otra forma no es posible generar URL con el sistema de enrutamiento.

Puedes leer la sección Opciones especiales para aprender cómo obtener dentro de una tarea la configuración de la aplicación automáticamente.

Ahora que se ha obtenido la instancia del enrutamiento, es muy sencillo generar cualquier URL con el método generate():

public function execute($arguments = array(), $options = array())
{
  $url = $this->getRouting()->generate('default', array('module' => 'foo', 'action' => 'bar'));
}

El primer argumento es el nombre de la ruta y el segundo argumento es un array con los parámetros de la ruta. El código anterior genera una URL relativa, que seguramente no es lo que queremos hacer. Desafortunadamente no es posible generar URL absolutas dentro de una tarea porque no se dispone del objeto sfWebRequest con el que obtener el host.

Una forma sencilla de evitar este problema consiste en definir el host dentro del archivo de configuración factories.yml:

all:
  routing:
    class: sfPatternRouting
    param:
      generate_shortest_url:            true
      extra_parameters_as_query_string: true
      context:
        host: example.org

El host se ha añadido como una opción llamada context_host. Esta es la opción que utiliza el enrutamiento al generar la URL absoluta:

public function execute($arguments = array(), $options = array())
{
  $url = $this->getRouting()->generate('my_route', array(), true);
}