如何在yii2-localeurls中禁用特定控制器/模块的语言环境重定向

时间:2015-06-01 08:17:09

标签: php yii2

我正在使用yii2-localeurls与Yii2中的语言环境相处。一切都很好。通过阅读文档,您会看到,重定向到已配置的语言或默认语言会自动发生(即使enableLanguageDetectionfalse)。我创建了ticket@github以确保即将推出此功能。

所以这是我的main.php配置:

'urlManager' => [
    'class' => 'codemix\localeurls\UrlManager',
    'languages' => [
        'en' => 'en-gb',
        'de' => 'de-de'
    ],
    'enableLanguageDetection' => false,
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [

    ],
],

根据$language {/ 1}}中的默认语言配置:

main.php

现在,我为API案例创建了一个模块,其路由如下。 'language' => 'en-gb', route-param映射到我的api模块的位置:

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(); } } modulecontroller停用重定向的任何信息。

2 个答案:

答案 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/#',
        ],
    ],
],