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

时间:2018-06-09 19:20:31

标签: yii2 yii2-advanced-app

我尝试使用bg类的www.domain.com/language/方法添加createUrl()UrlManager之类的语言,例如<?php namespace frontend\components; class UrlManager extends \yii\web\UrlManager { public function createUrl($params) { $url = parent::createUrl($params); return "/en{$url}"; } }

我正在尝试的测试是:

urlManager

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

中添加了课程
www.domain.com/en

由此我预期createUrl,但语言缺失。也许我误解了{{1}}方法。实现这一目标的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

您正在将/en添加到parent::createUrl()返回的网址之前。它会向您显示/enhttp://example.com/controller/action,您希望在域名后追加,然后附加其余的网址,因此您需要explode() URL并插入您想要的内容在所需位置内的chunk 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

答案 1 :(得分:1)

最好的方法是在您的网址规则中加入语言:

'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');