Module 如何更改yii2默认模块

Module 如何更改yii2默认模块,module,yii2,Module,Yii2,您好,我不是Yii2方面的专家,非常感谢您的帮助,我们希望更改默认模块, 我们的逻辑: 站点使用通配符域, 我们实现了一个引导组件来识别在 网址,即 现在我们希望使用相同的逻辑将默认模块更改为新的“子模块”,但我们不能使用引导,因为它发生在应用默认模块之后 显然,我们可以对模块进行显式url调用,即 'modules' => [ 'sub'=>[ 'class' => 'app\modules\sub\Module', ],... 但这意味着

您好,我不是Yii2方面的专家,非常感谢您的帮助,我们希望更改默认模块,
我们的逻辑:
站点使用通配符域,
我们实现了一个引导组件来识别在 网址,即

现在我们希望使用相同的逻辑将默认模块更改为新的“子模块”,但我们不能使用引导,因为它发生在应用默认模块之后

显然,我们可以对模块进行显式url调用,即

'modules' => [
    'sub'=>[
        'class' => 'app\modules\sub\Module',
    ],...
但这意味着url看起来是不受欢迎的


非常感谢

您无需更改模块配置。您需要更改此模块的web服务器路径,并按照UrlManager规则进行归档;

引导yii模块只是在其他组件之前加载它的一种方式。

在您的情况下,您可以做的是覆盖
UrlManager
组件,并手动调整路径以反映您希望在幕后创建的模块

因此,您的代码如下所示:

<?php

namespace app\components;

use Yii;

class UrlManager extends \yii\web\UrlManager
{
    public function parseRequest($request)
    {
        if (!empty(Yii::$app->sub)) {
            $pathInfo = $request->pathInfo;
            $moduleIds = array_keys(Yii::$app->modules);
            $inModule = false;
            foreach ($moduleIds as $moduleId) {
                if (preg_match("/^{$moduleId}/", $pathInfo)) {
                    $inModule = true;
                    break;
                }
            }

            if (!$inModule) {
                $pathInfo = 'sub/' . $pathInfo;
                $request->setPathInfo($pathInfo);
            }
        }

        return parent::parseRequest($request);
    }
}

模块的名称是否取决于子域,还是希望/在每个子域上调用相同的模块?根据需要,您可以设置为“sub/default/index”或配置漂亮的URL:@cebe我们每次都需要相同的模块。此外,它不仅是一个很好的url,而且最好的做法是将sub的逻辑与代码库的其余部分分开。谢谢谢谢@Chaim真的很有魅力,就是这样。
<?php

namespace app\components;

use Yii;

class UrlManager extends \yii\web\UrlManager
{
    public function parseRequest($request)
    {
        if (!empty(Yii::$app->sub)) {
            $pathInfo = $request->pathInfo;
            $moduleIds = array_keys(Yii::$app->modules);
            $inModule = false;
            foreach ($moduleIds as $moduleId) {
                if (preg_match("/^{$moduleId}/", $pathInfo)) {
                    $inModule = true;
                    break;
                }
            }

            if (!$inModule) {
                $pathInfo = 'sub/' . $pathInfo;
                $request->setPathInfo($pathInfo);
            }
        }

        return parent::parseRequest($request);
    }
}
'urlManager' => [
    'class' => 'app\components\UrlManager',
    ...
],