Yii2 使用 UrlManager::createUrl() 将语言添加到 URL

Yii2 prepend the language to the URL using UrlManager::createUrl()

我正在尝试使用 UrlManager class 的 createUrl() 方法在语言前加上 enbg 之类的 www.domain.com/language/ .

我只是为了测试而尝试的是:

<?php

namespace frontend\components;

class UrlManager extends \yii\web\UrlManager
{
    public function createUrl($params)
    {
        $url = parent::createUrl($params);

        return "/en{$url}";
    }
}

我在 urlManager 中添加了 class:

'urlManager' => [
    'class' => 'frontend\components\UrlManager',
    ...
],

据此我预计 www.domain.com/en 但缺少语言。也许我误解了 createUrl 方法。实现这一目标的正确方法是什么?

您将 /en 添加到从 parent::createUrl() 返回的 URL 之前。它会显示你喜欢/enhttp://example.com/controller/action,你想要的是在域名后面追加然后追加其余的URL,所以你需要explode() URL并将所需的块 en 插入所需的位置,您可以使用 array_splice().

只是为了更正,您可以使用以下

<?php

namespace frontend\components;


class UrlManager extends \yii\web\UrlManager
{
    public function createUrl($params)
    {
        $url = parent::createUrl($params);
        $chunks=explode('/', $url);

        array_splice($chunks,3,0,"en");
        return implode('/',$chunks);
    }
}

现在您将调用

Yii::$app->urlManager->createUrl(['/controller/action']);

它将生成

http://example.com/en/controller/action

最好的方法是将语言纳入您的 URL 规则:

'rules' => [
    '<lang:(en|bg)>' => 'site/homepage',
    '<lang:(en|bg)>/about' => 'site/about',
    // ...
],

如果未明确提供,则将语言作为参数注入 createUrl()

class UrlManager extends \yii\web\UrlManager {

    public function createUrl($params) {
        if (empty($params['lang'])) {
            $params['lang'] = 'en';
        }

        return parent::createUrl($params);
    }
}

现在您可以像往常一样创建URL,只有在您想要更改默认语言时才提供语言:

Url::to(['site/about']);                  // /en/about
Url::to(['site/about', 'lang' => 'en']);  // /en/about
Url::to(['site/about', 'lang' => 'bg']);  // /bg/about

您可以通过以下方式获取当前语言:

Yii::$app->request->get('lang', 'en');