Yii2使用UrlManager::createUrl()将语言前置到URL

Yii2使用UrlManager::createUrl()将语言前置到URL,yii2,yii2-advanced-app,Yii2,Yii2 Advanced App,我正在尝试使用UrlManager类的createUrl()方法预先编写语言,例如en或bg,比如www.domain.com/language/ 我只是想测试一下: <?php namespace frontend\components; class UrlManager extends \yii\web\UrlManager { public function createUrl($params) { $url = parent::createUrl

我正在尝试使用
UrlManager
类的
createUrl()
方法预先编写语言,例如
en
bg
,比如
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}";
    }
}

从这一点上,我期望
www.domain.com/en
,但语言缺失。也许我误解了
createUrl
方法。实现这一目标的正确方法是什么

您正在将
/en
前置到从
父::createUrl()
返回的URL。它将显示您喜欢的
/enhttp://example.com/controller/action
,您想要的是在域名后面追加,然后追加URL的其余部分,因此您需要
explode()
URL并将所需的区块
en
插入所需位置,您可以使用
数组()

为了进行更正,您可以使用以下命令

<?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);
    }
}
它将产生

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

您正在将
/en
前置到从
父::createUrl()
返回的URL。它将显示您喜欢的
/enhttp://example.com/controller/action
,您想要的是在域名后面追加,然后追加URL的其余部分,因此您需要
explode()
URL并将所需的区块
en
插入所需位置,您可以使用
数组()

为了进行更正,您可以使用以下命令

<?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);
    }
}
它将产生

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

最好的方法是在URL规则中包含语言:

'rules' => [
    '<lang:(en|bg)>' => 'site/homepage',
    '<lang:(en|bg)>/about' => 'site/about',
    // ...
],
现在,您可以像往常一样创建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');

最好的方法是在URL规则中包含语言:

'rules' => [
    '<lang:(en|bg)>' => 'site/homepage',
    '<lang:(en|bg)>/about' => 'site/about',
    // ...
],
现在,您可以像往常一样创建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');