Yii2 使用 UrlManager::createUrl() 将语言添加到 URL
Yii2 prepend the language to the URL using UrlManager::createUrl()
我正在尝试使用 UrlManager
class 的 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}";
}
}
我在 urlManager
中添加了 class:
'urlManager' => [
'class' => 'frontend\components\UrlManager',
...
],
据此我预计 www.domain.com/en
但缺少语言。也许我误解了 createUrl
方法。实现这一目标的正确方法是什么?
您将 /en
添加到从 parent::createUrl()
返回的 URL 之前。它会显示你喜欢/enhttp://example.com/controller/action
,你想要的是在域名后面追加然后追加其余的URL,所以你需要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
最好的方法是将语言纳入您的 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');
我正在尝试使用 UrlManager
class 的 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}";
}
}
我在 urlManager
中添加了 class:
'urlManager' => [
'class' => 'frontend\components\UrlManager',
...
],
据此我预计 www.domain.com/en
但缺少语言。也许我误解了 createUrl
方法。实现这一目标的正确方法是什么?
您将 /en
添加到从 parent::createUrl()
返回的 URL 之前。它会显示你喜欢/enhttp://example.com/controller/action
,你想要的是在域名后面追加然后追加其余的URL,所以你需要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
最好的方法是将语言纳入您的 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');