createAbsoluteUrl生成一个类似路径的URL,如何避免它?

时间:2012-04-25 13:54:18

标签: php url yii

我创建了一个这样的网址:

$app->createAbsoluteUrl('/', array(
     'param1' => 'val1',
     'param2' => 'var2',
);

生成的网址为:

http://mysite.com/param1/var1/param2/var2

但我希望这样的网址:

http://mysite.com/?param1=var1&param2=var2

在功能manual中,它说:

  

$ params数组附加的GET参数(name => value)。名称和值都将进行URL编码。

但它似乎并没有像那样工作。我如何生成预期的URL?感谢。

3 个答案:

答案 0 :(得分:3)

您需要指定urlManager应用程序组件应对其生成的URL使用“get”格式;默认是使用“路径”格式。 Yii指南explains如何在您的应用程序配置中执行此操作:

array(
    ......
    'components'=>array(
        ......
        'urlManager'=>array(
            'urlFormat'=>'get',
        ),
    ),
);

更新:所以你的urlFormat是“路径”,这是设计......那么替代方案呢?

如果您不介意扩展CWebApplication并在其位置使用您自己的派生类,那么您有几个选项,例如:

  1. 根据原始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;
    }
    
  2. 覆盖registerCoreComponents,以便您可以拥有第二个网址管理员:

    protected function registerCoreComponents()
    {
        parent::registerCoreComponents();
    
        $components=array(
            'specialUrlManager'=>array(
                'class'=>'CUrlManager',
                'urlFormat'=>'get',
            ),
        );
    
        $this->setComponents($components);
    }
    

    您现在可以随时致电Yii::app()->specialUrlManager->createUrl(...)

  3. 您还可以通过其他方式解决问题:

    1. 扩展CUrlManager并公开一种方法,允许您选择要在现场创建的网址风格。

    2. 如果你只需要在一两个地方“获取”网址,你可以随时创建一个新的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。