我尝试使用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}}方法。实现这一目标的正确方法是什么?
答案 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');