Yii2 URL管理器不解析规则


Yii2 URL manager doesn't parse the rule

我正在尝试使用Yii URL管理器重写URL,如/site/about?tab=valuesite/about/valuesite/value

我的规则/<tab:'w+>' => 'site/about不起作用。以下是完整的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'],
]);

您应该使用命名参数,但您正在命名模块/控制器部分。
您只能使用以下3个保留字:

模块、控制器、动作

像文档的例子:

[
    '<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");
        }
    }

问题是/<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);
}