4

我创建一个这样的 URL:

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

生成的网址是:

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

但我期望这样的网址:

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

在功能手册中它说:

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

但它似乎不像那样工作。如何生成预期的 URL?谢谢。

4

3 回答 3

3

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

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,以便您可以拥有第二个 url 管理器:

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

    您现在可以Yii::app()->specialUrlManager->createUrl(...)随时拨打电话。

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

  1. 扩展CUrlManager和公开一种方法,允许您选择 url 的风格以在现场创建。

  2. 如果你只需要在一两个地方“获取”url,你总是可以创建一个新CUrlManager对象,当场配置它,调用createUrl然后丢弃它。您还可以将这种丑陋隐藏在免费功能后面。本质上,这种(当然不推荐)方法是第一个解决方法的低技术版本,因为它具有不需要扩展的优点CWebApplication

于 2012-04-25T15:34:13.973 回答
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';

虽然我没有也不想测试第二种方法。

于 2012-04-25T18:13:50.857 回答
0

URL 路由的格式应为“ControllerID/ActionID”。手动的

您的手动链接适用于 CController,不适用于 CApplication。

于 2012-04-25T15:10:49.847 回答