我正在尝试在语言前面加上createUrl()
类的UrlManager
方法,例如www.domain.com/language/
之类的en
或bg
。
为了测试,我尝试的是:
<?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
方法。实现这一目标的正确方法是什么?
发布于 2018-06-10 04:24:19
您正在将/en
添加到从parent::createUrl()
返回的URL中。它会像/enhttp://example.com/controller/action
一样向你展示,你想要的就是在域名后面追加,然后追加网址的其余部分,所以你需要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
发布于 2018-06-10 22:33:57
最好的方法是在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');
https://stackoverflow.com/questions/50777706
复制相似问题