我正在使用yii2-localeurls与Yii2中的语言环境相处。一切都很好。通过阅读文档,您会看到,重定向到已配置的语言或默认语言会自动发生(即使enableLanguageDetection
为false
)。我创建了ticket@github以确保即将推出此功能。
main.php
配置:'urlManager' => [
'class' => 'codemix\localeurls\UrlManager',
'languages' => [
'en' => 'en-gb',
'de' => 'de-de'
],
'enableLanguageDetection' => false,
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
main.php
现在,我为API案例创建了一个模块,其路由如下。 'language' => 'en-gb',
route-param映射到我的api
模块的位置:
API
application.com/api/<controller>/<action>
如果调用API模块,我不希望yii2-localeurls重定向到语言环境。无法找到有关针对特定//namespace define
namespace app\modules\api;
use Yii;
/**
* Class api
*
* @package app\modules\api
*/
class api extends \yii\base\Module
{
// ####################################### Class attributes // #####################################################
/**
* Controller namespace
* @var string
*/
public $controllerNamespace = 'app\modules\api\controllers';
// ########################################## Class methods // #####################################################
/**
* Init API module
*/
public function init()
{
//call parent class init
parent::init();
}
}
,module
或controller
停用重定向的任何信息。
答案 0 :(得分:2)
此时,您提到的组件实际上并不支持这种行为。所以我担心这个问题不容易回答(至少不是我能想到的)。
...然而
由于URL解析在整个过程中很早就完成了,所以它会让你有点蠢蠢欲动。在进行解析之前,只有一个地方可以挂钩:&#34; beforerequest&#34;。
因此,我在这里看到的唯一方法是在配置中添加第二个(常规)urlManager
,该API适用于API,并在您检测到API请求时将其交换出来。
这样做的方法是+ - 像这样:
'components' => [
'apiUrlManager' => [
'class' => '\yii\web\UrlManager',
...
]
]
还要在配置中添加它(顶级):
'on beforeRequest' => function($event) {
if (substr($_SERVER['REQUEST_URI'], 0, 5) == '/api/')
\Yii::$app->set('urlManager', \Yii::$app->get('apiUrlManager'));
},
每当请求进入api时,它将使用定期配置的组件进行URL解析并跳过语言检测等。
它有效,但它是否是最好的方法?我会把它留给你。
或者您可以随时添加功能请求以向localeurls-component添加忽略路由支持:)
答案 1 :(得分:2)
yii2-localurl现在允许定义ignoreLanguageUrlPatterns
以从区域设置匹配中排除路由。请参阅Documentation。
在我的情况下,我想忽略/api
被localurl转换。我的yii2 config
看起来如下。它就像一个魅力。
'components' => [
'urlManager' => [
'class' => 'codemix\localeurls\UrlManager',
'languages' => [
'en' => 'en-gb',
'de' => 'de-de'
],
'enableLanguageDetection' => false,
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
// Ignore / Filter route pattern's
'ignoreLanguageUrlPatterns' => [
'#^api/#' => '#^api/#',
],
],
],