我创建了一个这样的 URL:
$app->createAbsoluteUrl('/', array(
'param1' => 'val1',
'param2' => 'var2',
);
生成的 URL 是:
http://mysite.com/param1/var1/param2/var2
但我期望这样的 url:
http://mysite.com/?param1=var1¶m2=var2
函数中manual它说:
$params array additional GET parameters (name=>value). Both the name and value will be URL-encoded.
但是好像不是这样的。如何生成预期的 URL?谢谢。
最佳答案
您需要指定 urlManager
应用程序组件应为其生成的 URL 使用“get”格式;默认是使用“路径”格式。 Yii 指南 explains如何在您的应用程序配置中执行此操作:
array(
......
'components'=>array(
......
'urlManager'=>array(
'urlFormat'=>'get',
),
),
);
更新:所以您的urlFormat
是“路径”,这是设计使然……替代方案呢?
如果您不介意扩展 CWebApplication
并在其位置使用您自己的派生类,那么您有多种选择,例如:
在原来的
createUrl
的基础上定义自己的createUrlEx
方法。它可能看起来像这样: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
并公开一个允许您选择要在现场创建的 url 风格的方法。如果你只需要在一两个地方“获取”url,你总是可以创建一个新的
CUrlManager
对象,当场配置它,调用createUrl
然后丢弃它。您还可以将这种丑陋隐藏在免费功能的背后。本质上,这种(诚然不推荐)方法是第一种解决方法的低技术版本,因为它具有不需要扩展CWebApplication
的优点。
关于php - createAbsoluteUrl 生成类似路径的 URL,如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10317188/