1

假设我的 yii 站点基域是http://ii.local.

http://events.ii.local除了我需要处理控制器的所有操作外,所有控制器操作都可以显示在基本域上event

通过通话$this->createUrl('/event/index',array('code' => 'guruevent')) ,我需要生成的网址为http://events.ii.local/guruevent

通过调用$this->createUrl('/site/login') ,我需要生成的 url 为http://ii.local/site/login.

'urlManager'=>array(
    'urlFormat'=>'path',
            'showScriptName'=>false,                             
            'caseSensitive'=>false,
        'rules'=>array(                                                                                     
                'http://events.ii.local/<code:\w+>'
                    => '<controller:event>/<action:index>', 
                'http://events.ii.local/<code:\w+>/<action:\w+>'
                    => '<controller:event>/<action>/<code>',
                '<controller:\w+>/<action:\w+>'
                    => '<controller>/<action>',
            ),
     ),

事件子域的 URL 是使用/event/index?code=guruevent而不是使用 events.ii.local 子域生成的。

单域路由工作正常,但我需要为少数控制器和模块使用少数子域。我也试图设置 request->baseUrl 但是一旦我将它设置为http://ii.local/所有路由停止并且所有网址都打开相同的主页。

请提出修复建议。

4

2 回答 2

1

交换你的第一条和第二条规则。规则按顺序处理,并使用第一个匹配的。UrlManager 不寻找最佳匹配,而是先到先得。

自从

$this->createUrl('/event/index',array('code' => 'guruevent'))

匹配第一个规则提供的模式,它将使用该规则,而不管存在的“额外”数据code

一个好的经验法则是始终将最具体的规则放在首位,以确保它们匹配,然后完成一般规则以捕捉任何不符合细节的规则。

于 2013-03-27T16:54:41.753 回答
0

您可以使用自定义函数来创建您的 URL。例如url($route, $params=array()). 您将Yii::app()->createUrl()在内部使用,并且取决于$route会在它前面加上您的其他主机名。然后在您的项目中始终使用此功能来创建 URL。

如果您有信心,您还可以增强您的实现并为该函数添加更多参数,例如$schema=''or $absolute=false。这样你就可以使用这个函数来创建你项目中需要的所有类型的 URL。

另一种方法是编写您的自定义urlManager组件,该组件扩展自然CUrlManager后覆盖createUrl()。在那里您可以按照上面的建议执行相同的操作:检查$route并创建适当的 URL。

于 2013-03-27T16:41:00.663 回答