yii2 createUrl 正在复制路由

yii2 createUrl is duplicating the route

我正在用英语和阿拉伯语构建多语言网站

url for English

url for Arabic

我想将语言从任何页面完全切换到其他语言的同一页面 所以我做了如下代码。

   $route = Yii::$app->controller->route;
   $params = $_GET;
   array_unshift($params, '/'.$route);

  <?php if(Yii::$app->language == 'ar'){ ?>
  <?= Html::a('English', [Yii::$app->urlManager->createUrl($params), 'language'=>'en']); ?>
  <?php }else{?>
  <?= Html::a('Arabic', [Yii::$app->urlManager->createUrl($params), 'language'=>'ar']); } ?>

我的url生成如下

/multi/backend/web/en/multi/backend/web/ar/site/index?val=hii&net=good

English

不知道怎么了?

我正在使用 this 进行语言管理。

请在backend/config

下查看我的main.php
            <?php
            $params = array_merge(
                require(__DIR__ . '/../../common/config/params.php'),
                require(__DIR__ . '/../../common/config/params-local.php'),
                require(__DIR__ . '/params.php'),
                require(__DIR__ . '/params-local.php')
            );

            return [
                'id' => 'app-backend',
                'basePath' => dirname(__DIR__),
                'controllerNamespace' => 'backend\controllers',
                'language' => 'en',
                'sourceLanguage' => 'en_UK',
                'bootstrap' => ['log'],
                'modules' => [],
                'components' => [
                    'user' => [
                        'identityClass' => 'common\models\User',
                        'enableAutoLogin' => true,
                    ],
                    'log' => [
                        'traceLevel' => YII_DEBUG ? 3 : 0,
                        'targets' => [
                            [
                                'class' => 'yii\log\FileTarget',
                                'levels' => ['error', 'warning'],
                            ],
                        ],
                    ],
                    'errorHandler' => [
                        'errorAction' => 'site/error',
                    ],
                    'i18n' => [
                        'translations' => [
                            'app' => [
                                'class' => 'yii\i18n\DbMessageSource',
                                'sourceLanguage' => 'en_UK',
                            ],
                        ],
                     ],
                    'urlManager' => [
                        'class' => 'codemix\localeurls\UrlManager',
                        'languages' => ['en', 'ar'],
                        'enableDefaultLanguageUrlCode' => false,
                        'enablePrettyUrl' => true,
                        'showScriptName' => false,
                        'rules' => [
                        ],
                    ],
                ],
                'params' => $params,
            ];

如果你像你的例子那样做,你必须在你创建的每个 link 上考虑它。这可以很容易地实现自动化。

URL-规则

您可以在配置文件中使用 url 规则解决此问题,如下所示:

'<language:[\w]{2,2}>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

这将声明正确的路由到您的控制器,并在 language 变量中为您提供所需的语言。

自定义 UrlManager

您可以扩展 UrlManager-class 并确保当前语言始终附加到参数:

class MyUrlManager extends \yii\web\UrlManager
{
    // ...

    /**
     * @inheritdoc
     */
    public function createUrl($params)
    {
        if (!isset($params['language'])) {
            $params['language'] = Yii::$app->language;
        }

        return parent::createUrl($params);
    }

    // ...
}

这将使将语言添加到您创建的 link 的过程自动化。

自定义应用程序

现在您还应该覆盖 Application-class 并始终将语言设置为提供的语言或选择默认语言(在本例中为 en):

class MyApplication extends \yii\web\Application
{
    // ...

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();

        $lang = Yii::$app->request->get('language', 'en');
        Yii::$app->language = $lang;
    }

    // ...
}

现在您的语言将始终设置为默认值或通过上面指定的查询参数提供的语言。

最后的想法

这应该让您了解如何解决问题的基本思路。根据需要进行调整...尤其是最后一部分 Application-class 以及如何检索 language-var 的值。希望对您有所帮助!

您的代码和提供的扩展可能存在问题

如果您阅读扩展的文档,url 的生成方式会有所不同。它告诉您按如下方式创建 urls:

Url::to(['demo/action', 'language'=>'ar'])

您正在创建一个简单的 link 标签并覆盖 $params。试试这个:

echo Html::a('Arabic', Url::to(['site/index', 'language'=>'ar']));

要重定向到当前页面,只需将第一部分替换为当前路由即可。

经过大量尝试..我找到了解决方案..现在对我有用了。

    $route = Yii::$app->controller->route;
    if(Yii::$app->language == 'ar'){
        $_GET['language'] = 'en';
    }else{
        $_GET['language'] = 'ar';
    }
    $params = $_GET;
    array_unshift($params, '/'.$route);

  <?php if(Yii::$app->language == 'ar'){ ?>
  <?= Html::a('English', Yii::$app->urlManager->createUrl($params)); ?>
  <?php }else{?>
  <?= Html::a('Arabic', Yii::$app->urlManager->createUrl($params)); } ?>

它为 url 喜欢的人工作

http://localhost/multi/backend/web/site/index?page=2&per-page=6

http://localhost/multi/backend/web/site/index