Использование маршрутов для генерации URL-адресов в задаче Symfony

Я использую Symfony 1.3.6 на Ubuntu 10.0.4 LTS.

Я написал задачу Symfony, которая генерирует отчет, содержащий ссылки (URL).

Вот фрагмент метода execute() в моем классе задач:

  protected function execute($arguments = array(), $options = array())
  {
    //create a context
    sfContext::createInstance($this->configuration);
    sfContext::getInstance()->getConfiguration()->loadHelpers(array('Url', 'Asset', 'Tag'));

    ...
    $url = url_for("@foobar?cow=marymoo&id=42");

    // Line 1
    echo '<a href="'.$url.'">This is a test</a>';

    // Line 2
    echo link_to('This is a test', $url); 
  }

Имя маршрута определяется следующим образом:

foobar:
  url: /some/fancy/path/:cow/:id/hello.html
  param: {  module: mymodule, action: myaction }

Когда это запускается, сгенерированная ссылка:

Строка 1 выдает следующий результат:

./symfony/symfony/some/fancy/path/marymoo/42/hello.html

вместо ожидаемого:

/some/fancy/path/marymoo/42/hello.html

Строка 2 выдает ошибку:

Не удалось найти соответствующий маршрут для генерации URL-адреса для параметров «массив ( 'action' => 'symfony', 'module' => '.',)».

Опять же, ожидаемый URL-адрес:

/some/fancy/path/marymoo/42/hello.html

Как я могу это решить?


person morpheous    schedule 19.07.2010    source источник


Ответы (4)


Чтобы сгенерировать URL в задаче:

protected function execute($arguments = array(), $options = array())
{
  $routing = $this->getRouting();
  $url = $routing->generate('route_name', $parameters);
}

Мы добавляем метод для создания маршрутизации, чтобы всегда использовался рабочий URL:

   /**
   * Gets routing with the host url set to the url of the production server
   * @return sfPatternRouting
   */
  protected function getProductionRouting()
  {
    $routing = $this->getRouting();
    $routingOptions = $routing->getOptions();
    $routingOptions['context']['host'] = 'www.example.com';
    $routing->initialize($this->dispatcher, $routing->getCache(), $routingOptions);
    return $routing;
  }
person Jeremy Kauffman    schedule 20.07.2010
comment
+1 за хороший краткий фрагмент, который показывает мне, как решить эту проблему. Я немного изменю код, чтобы он соответствовал тому, что я делаю, протестирую его, если он сработает, я приму этот ответ. - person morpheous; 20.07.2010
comment
Куда мне поместить этот фрагмент? Я не могу вызвать $this-›getRouting() из задачи :/ - person JavierIEH; 22.10.2012
comment
Вы можете использовать sfContext::getInstance()->getRouting() в задаче. - person Omn; 08.11.2012

Если вы хотите использовать стандартные помощники (например, url_for) для генерации URL-адреса, возможно, этот код может вам помочь:

  protected function execute($arguments = array(), $options = array())
  {
    // initialize the database connection
...
$context = sfContext::createInstance($this->configuration);

$routing = $context->getRouting();
$_options = $routing->getOptions();
$_options['context']['prefix'] = "";// "/frontend_dev.php" for dev; or "" for prod
$_options['context']['host'] = sfConfig::get('app_url_base');
$routing->initialize($this->dispatcher, $routing->getCache(),$_options);
$context->getConfiguration()->loadHelpers('Partial');
$context->set('routing',$routing);    
//$_SERVER['HTTP_HOST'] = sfConfig::get('app_url_base'); // ---> I don't remember why I have this on my code, shouldn't be necessary
...

Затем вы можете использовать функцию url_for везде с волшебным образом работающим параметром absolute=true.

Конечно, вам нужно добавить определение *url_base* в ваш app.yml (или, может быть, вы можете оставить его закодированным)

person glerendegui    schedule 16.09.2012
comment
Большое спасибо, это сработало для меня. небольшой комментарий: $options используется для параметров командной строки задачи, поэтому другое имя для переменной позволяет избежать проблем.. - person Tapper; 30.10.2012

У меня была та же проблема, и я нашел следующий фрагмент кода: http://snippets.symfony-project.org/snippet/378

Решение довольно похоже, однако оно расширяет ProjectConfiguration. Преимущество этого подхода в том, что он прозрачно работает и в модулях.

person derflocki    schedule 05.10.2011

Вы можете настроить параметры запроса по умолчанию для команд (sfTask) в сценарии конфигурации проекта config/ProjectConfiguration.class.php

class ProjectConfiguration extends sfProjectConfiguration {

    public function setup() {
        ...
        $this->dispatcher->connect('command.pre_command', array('TaskWebRequest', 'patchConfig'));
    }

}

class TaskWebRequest extends sfWebRequest {

    public function __construct(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array())
    {
        $options['no_script_name'] = true;
        $options['relative_url_root'] = '';
        parent::__construct($dispatcher, $parameters, $attributes, $options);
    }

    public static function patchConfig(sfEvent $event) {
        sfConfig::set('sf_factory_request', 'TaskWebRequest');
    }

}
person Evgeniy Generalov    schedule 03.07.2015