我在Ubuntu 10.0.4 LTS上运行Symfony 1.3.6。
我编写了一个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的/一些/花式/路径/ marymoo / 42 / hello.html的
而不是预期的:
/some/fancy/path/marymoo/42/hello.html
第2行会产生错误:
无法找到匹配的路线 为params生成url“array( 'action'=&gt; 'symfony','module'=&gt; '')”。
同样,预期的URL是:
/some/fancy/path/marymoo/42/hello.html
我该如何解决这个问题?
答案 0 :(得分:17)
在任务中生成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;
}
答案 1 :(得分:3)
我想使用标准助手(如url_for)来生成网址,也许这段代码可以帮到你:
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 函数无处不在,绝对= true参数可以神奇地工作。
当然,你需要在你的app.yml中添加一个* url_base *定义(或者你可以让它留下编码)
答案 2 :(得分:1)
我遇到了同样的问题,发现了以下代码段:http://snippets.symfony-project.org/snippet/378
解决方案非常相似,但它扩展了ProjectConfiguration。这种方法的优点是,它在模块中也可以透明地工作。
答案 3 :(得分:0)
您可以在项目配置脚本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');
}
}