2015-07-21 141 views
1

我正在尝试使用Yii URL管理器来重写URL,如/site/about?tab=valuesite/about/valuesite/value。我的规则/<tab:\w+>' => 'site/about不起作用。以下是完整的URL管理器代码:Yii2 URL管理器不解析规则

'urlManager' => [ 
     'enablePrettyUrl' => true, 
     'showScriptName' => false, 
     'rules' => 
     [ 
      '/' => 'site/index',     
      '/deals' => '/deal/deals', 
      '/<tab:\w+>' => 'site/about', //my rule 
      '/about' => 'site/about', 
      '/<action:[\-\w]+>' => 'site/<action>', 
      '/<module:\w+>' => '<module>/default/index', 
      '/<module:\w+>/<controller:\w+>/<id:\d+>' => '/<module>/<controller>/view', 
      '/<module:\w+>/<controller:\w+>/<id:\d+>/<action:[\-\w]+>/<entity_id:\d+>' => '/<module>/<controller>/<action>', 
      '/<module:\w+>/<controller:\w+>/<id:\d+>/<action:[\-\w]+>' => '/<module>/<controller>/<action>', 
      '/<controller:\w+>/<id:\d+>' => '<controller>/view', 
      '/<controller:\w+>/<id:\d+>/<action:[\-\w]+>/<entity_id:\d+>' => '<controller>/<action>', 
      '/<controller:\w+>/<id:\d+>/<action:[\-\w]+>' => '<controller>/<action>', 

      '/<controller:\w+>/<action:[\-\w]+>' => '<controller>/<action>', 
      '/<module:\w+>/<action:[\-\w]+>' => '<module>/default/<action>', 
      '/<module:\w+>/<controller:\w+>' => '<module>/<controller>/index', 

     ], 

,这里是小部件代码:

echo Nav::widget([ 
    'items' => [ 
     ['label' => '1', 'url' => ['/site/about', 'tab' => '']], 
     ['label' => '2', 'url' => ['/site/about', 'tab' => 'value']], 
     ['label' => '3', 'url' => ['site/about', 'tab' => 'tariffs']], 
     ['label' => '4', 'url' => ['site/about', 'tab' => 'team']], 
     ['label' => '5', 'url' => ['site/about', 'tab' => 'documents']], 
    ], 
    'options' => ['class' =>'nav-pills nav-stacked c-nav'], 
]); 
+1

不知道我的理解:你要删除的查询字符串(即每当site/about被请求时,来自URL的'?'后的url部分? – tarleb

+0

@tarleb,我想用'/ '=>'site/about'将像/'/ about?tab = value'这样的URL转换为'/ site/value'(和其他具有不同标签值的URL)。 –

回答

1

您应该使用命名的参数,但你命名的模块/控制器的一部分。
您只能使用这3个保留字:

模块,控制器,动作

docs例子:

[ 
    '<controller:(post|comment)>/<id:\d+>/<action:(create|update|delete)>' => '<controller>/<action>', 
    '<controller:(post|comment)>/<id:\d+>' => '<controller>/view', 
    '<controller:(post|comment)>s' => '<controller>/index', 
] 

但是,你正在使用<tab:\w+>这并不手段任何规则部分

也许你可以使用:

'/site/about/<tab:\w+>' => 'site/about', 

赶上像URL:

web.com/site/about/bla

然后在控制器中您可以使用$tab变量像

namespace app\controllers; 

class SiteController extends \yii\web\Controller { 
     public function actionAbout($tab) 
     { 
      return $this->renderContent("Hello $tab"); 
     } 
    } 

希望这有助于。

+1

谢谢你的答案。我发现可以使用命名参数,如''=>'site/about'或'/ about/'=>'site/about' 。 –

+0

很高兴知道!我看到你的答案,并会尝试 –

1

问题是像/<controller:\w+>/<action:[\-\w]+>' => '<controller>/<action>/<action:[\-\w]+>' => 'site/<action>这样的规则比我的更早被解析,所以我改变了它们。 这里是我的解决方案:

'urlManager' => [ 
     'enablePrettyUrl' => true, 
     'showScriptName' => false, 
     'rules' => 
     [ 
      '/' => 'site/index', 
      '<tab:(about)>' => 'site/about', 
      '/about/<tab:(about|value|documents|tariffs|team)>' => 'site/about', 
      '/<action:(index|login|logout|contact|signup|request-password-reset|reset-password|thank-for-register|connect-inviteduser)>' => 'site/<action>', 
      '/<controller:(deal)>/<action:\w>' => 'deal/<action>', 
      '/<module:(trades)>' => '<module>/default/index', 
      '/<module:(trades)>/<controller:\w+>/<id:\d+>' => '/<module>/<controller>/view', 
      '/<module:(trades)>/<controller:\w+>/<id:\d+>/<action:[\-\w]+>/<entity_id:\d+>' => '/<module>/<controller>/<action>', 
      '/<module:(trades)>/<controller:\w+>/<id:\d+>/<action:[\-\w]+>' => '/<module>/<controller>/<action>', 
      '/<controller:\w+>/<id:\d+>' => '<controller>/view', 
      '/<controller:\w+>/<id:\d+>/<action:[\-\w]+>/<entity_id:\d+>' => '<controller>/<action>', 
      '/<controller:\w+>/<id:\d+>/<action:[\-\w]+>' => '<controller>/<action>', 
      '/<module:(trades)>/<action:[\-\w]+>' => '<module>/default/<action>', 
      '/<module:(trades)>/<controller:\w+>' => '<module>/<controller>/index', 

     ], 
    ], 

部件代码:

<?php 
         echo Nav::widget([ 
          'items' => [ 
           ['label' => 'О проекте', 'url' => ['/site/about', 'tab' => 'about']], 
           ['label' => '5 причин работать через портал', 'url' => ['/site/about', 'tab' => 'value']], 
           ['label' => 'Продвижение и тарификация', 'url' => ['site/about', 'tab' => 'tariffs']], 
           ['label' => 'Проектная команда', 'url' => ['site/about', 'tab' => 'team']], 
           ['label' => 'Документы', 'url' => ['site/about', 'tab' => 'documents']], 
          ], 
          'options' => ['class' =>'nav-pills nav-stacked c-nav'], 
         ]); 
         ?> 

,并且行动码:

public function actionAbout($tab = 'about') 
{ 
    $this->layout = '/about'; 

    $tab = $tab == 'about' ? 'index' : $tab; 
    if (Yii::$app->request->isAjax) 
     return $this->renderPartial('about/' . $tab); 
    else 
     return $this->render('about/' .$tab); 
}