我创建了一个这样的网址:
$app->createAbsoluteUrl('/', array(
'param1' => 'val1',
'param2' => 'var2',
);
生成的网址为:
http://mysite.com/param1/var1/param2/var2
但我希望这样的网址:
http://mysite.com/?param1=var1¶m2=var2
在功能manual中,它说:
$ params数组附加的GET参数(name => value)。名称和值都将进行URL编码。
但它似乎并没有像那样工作。我如何生成预期的URL?感谢。
答案 0 :(得分:3)
您需要指定urlManager
应用程序组件应对其生成的URL使用“get”格式;默认是使用“路径”格式。 Yii指南explains如何在您的应用程序配置中执行此操作:
array(
......
'components'=>array(
......
'urlManager'=>array(
'urlFormat'=>'get',
),
),
);
更新:所以你的urlFormat
是“路径”,这是设计......那么替代方案呢?
如果您不介意扩展CWebApplication
并在其位置使用您自己的派生类,那么您有几个选项,例如:
根据原始createUrlEx
定义您自己的createUrl
方法。它看起来像这样:
public function createUrlEx($format,$route,$params=array(),$ampersand='&')
{
$oldFormat = $this->getUrlManager()->getUrlFormat();
$this->getUrlManager()->setUrlFormat($format);
$url = $this->getUrlManager()->createUrl($route,$params,$ampersand);
$this->getUrlManager()->setUrlFormat($oldFormat);
return $url;
}
覆盖registerCoreComponents
,以便您可以拥有第二个网址管理员:
protected function registerCoreComponents()
{
parent::registerCoreComponents();
$components=array(
'specialUrlManager'=>array(
'class'=>'CUrlManager',
'urlFormat'=>'get',
),
);
$this->setComponents($components);
}
您现在可以随时致电Yii::app()->specialUrlManager->createUrl(...)
。
您还可以通过其他方式解决问题:
扩展CUrlManager
并公开一种方法,允许您选择要在现场创建的网址风格。
如果你只需要在一两个地方“获取”网址,你可以随时创建一个新的CUrlManager
对象,在现场配置它,调用createUrl
然后丢弃它。你也可以在免费功能背后隐藏这种丑陋。基本上这个(诚然不推荐)方法是第一种解决方法的低技术版本,因为它具有不需要扩展CWebApplication
的优势。
答案 1 :(得分:3)
您应该可以使用类似Yii::app()->urlManager->createPathInfo
的内容。这将使用自定义&
和=
生成查询字符串为...& var = val& ...你喜欢。您可以使用它来按需创建URL的查询字符串版本:
$url = $this->createAbsoluteUrl('/').'index.php?'.Yii::app()->urlManager->createPathInfo($arrayOfStuff);
或者您甚至可以这样做:
Yii::app()->urlManager->urlFormat = 'get';
$this->createAbsoluteUrl('My/Path');
Yii::app()->urlManager->urlFormat = 'path';
虽然我没有也不想测试第二种方法。
答案 2 :(得分:0)
URL路由的格式应为“ControllerID / ActionID”。 manual
您的手动链接适用于CController,不适用于CApplication。