首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Yii2使用UrlManager::createUrl()将语言添加到URL

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

Stack Overflow用户
提问于 2018-06-10 03:20:31
回答 2查看 150关注 0票数 0

我正在尝试在语言前面加上createUrl()类的UrlManager方法,例如www.domain.com/language/之类的enbg

为了测试,我尝试的是:

代码语言:javascript
复制
<?php

namespace frontend\components;

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

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

在我的urlManager中添加了这个类

代码语言:javascript
复制
'urlManager' => [
    'class' => 'frontend\components\UrlManager',
    ...
],

因此,我期望使用www.domain.com/en,但是缺少该语言。也许我误解了createUrl方法。实现这一目标的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-10 04:24:19

您正在将/en添加到从parent::createUrl()返回的URL中。它会像/enhttp://example.com/controller/action一样向你展示,你想要的就是在域名后面追加,然后追加网址的其余部分,所以你需要explode() URL,并将你想要的块en插入到你想要的位置中,你可以使用array_splice()来做到这一点。

为了进行更正,您可以使用以下代码

代码语言:javascript
复制
<?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);
    }
}

现在,当您要调用

代码语言:javascript
复制
Yii::$app->urlManager->createUrl(['/controller/action']);

它将生成

代码语言:javascript
复制
http://example.com/en/controller/action
票数 2
EN

Stack Overflow用户

发布于 2018-06-10 22:33:57

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

代码语言:javascript
复制
'rules' => [
    '<lang:(en|bg)>' => 'site/homepage',
    '<lang:(en|bg)>/about' => 'site/about',
    // ...
],

如果没有明确提供,则将语言作为参数注入到createUrl()中:

代码语言:javascript
复制
class UrlManager extends \yii\web\UrlManager {

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

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

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

代码语言:javascript
复制
Url::to(['site/about']);                  // /en/about
Url::to(['site/about', 'lang' => 'en']);  // /en/about
Url::to(['site/about', 'lang' => 'bg']);  // /bg/about

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

代码语言:javascript
复制
Yii::$app->request->get('lang', 'en');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50777706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档