Yii2 - UrlManager и params с гипсами - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующие URL:

http://test.local/index.php?r=site%2Findex&slug=blog-detail
http://test.local/index.php?r=site%2Findex&slug=blog
http://test.local/

Я хочу получить:

http://test.local/blog
http://test.local/blog-detail
http://test.local/ 

Я отправляю все запросы на SiteController::actionIndex($slug), я использую базовый шаблон приложения.

До сих пор я был в состоянии скрыть index.php и site/index.

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
       '<slug\w+>' => 'site/index',
    ],
]

Но, похоже, \w+ не соответствует строкам с -. Также, если слаг пуст, он должен показывать: http://test.local/.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

\w не соответствует -. Вам нужно использовать [\w\-] вместо этого. И + требует по крайней мере один символ в вашем случае. Вы должны использовать * вместо:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
       '<slug:[\w\-]*>' => 'site/index',
    ],
]
0 голосов
/ 03 июля 2018

То, что вы пытаетесь сделать, это создать конкретный URL на основе GET-параметра. В следующем примере, если пользователь вводит url test.local / Some-nice-article , тогда функция SiteController::actionIndex($slug) получит параметр.

'urlManager' => [
            'pattern' => '<slug>',
            'route' =>'site/index',
            'ecnodeParams' => false,
            //class => any\custom\UrlRuleClass,
            //defaults => [] 
        ]

Или вы хотите, чтобы другой URL указывал, является ли это подробный вид? Вы можете сделать это следующим образом:

  'urlManager' => [
                'pattern' => '<slug>-detail',
                'route' =>'site/detail',
                'ecnodeParams' => false,
                //class => any\custom\UrlRuleClass,
                //defaults => [] 
            ]

В этом примере, если пользователи помещают строку '-detail' в слаг, тогда он будет анализировать маршрут SiteController::actionDetail($slug) к запросу.

Обратите внимание, что, если вы еще этого не сделали, включите prettyUrls в файле конфигурации

Вы можете найти немного больше об этой теме в этом ответе или в Yii2 окончательном руководстве

...