Module Yii2:从模块路由中忽略控制器ID

Module Yii2:从模块路由中忽略控制器ID,module,yii2,url-routing,yii2-module,Module,Yii2,Url Routing,Yii2 Module,模块控制器中任何动作的典型Yi2路径如下所示: / 我们如何配置/构造我们的模块(只有一个控制器),以便我们可以使用以下路径直接达到其操作: / 无需覆盖主应用程序的urlManager中的路由?如果“无需覆盖主应用程序的urlManager中的路由”是指不修改urlManager路由,我认为这是不可能的 但如果你只是说“没有在应用程序的配置文件中添加新的路由规则”,那么以下是方法: 您可以通过在模块内设置规则来实现 如果还没有模块,请将其添加到配置的引导部分 现在在主模块的文件(default

模块控制器中任何动作的典型Yi2路径如下所示:

/

我们如何配置/构造我们的模块(只有一个控制器),以便我们可以使用以下路径直接达到其操作:

/

无需覆盖主应用程序的urlManager中的路由

如果“无需覆盖主应用程序的urlManager中的路由”是指不修改urlManager路由,我认为这是不可能的

但如果你只是说“没有在应用程序的配置文件中添加新的路由规则”,那么以下是方法:

您可以通过在模块内设置规则来实现

如果还没有模块,请将其添加到配置的
引导
部分

现在在主模块的文件(default module.php)中添加:

公共函数引导($app)
{
if($app instanceof\yii\web\Application){
$app->urlManager->addRules([
['your-module/'=>'your-module/controllers name/'],
]);
}
}

除了Bizley的答案之外,您还可以在模块中创建单独的配置文件,其中包含模块特定的url规则,例如:

modules//config/url rules.php

然后在模块引导方法中加载这些规则(如show Bizley所示)。 然后,您可以在主应用程序中自动扫描可用的模块和类似的配置文件,并将这些url规则与公共应用程序配置合并。 此外,在加载模块时,防止重复这些规则也很重要


我不喜欢这种方法,因为它打破了“模块化”,但是它可以在不启动所有模块的情况下工作(这非常有助于保持内存)。

结合我自己的答案和一些智慧,我想出了一个解决方案。只要您的模块是通过composer添加的,您就可以这样做:

  • 在您的模块中,创建一个包含以下内容的
    RouteBootstrap.php
    文件:

    namespace your\name\space;
    
    class RouteBootstrap implements \yii\basic\BootstrapInterface {
        public function bootstrap($app) {
            if ($app instanceof \yii\web\Application) {
                $app->urlManager->addRules([
                    ['moduleID/<action>' => 'moduleID/default/<action>'],
                ]);
            }
        }
    }
    
    有关此技巧的更多详细信息,请参阅

  • 供应商
    目录中删除模块,然后运行
    编写器更新

  • 就这样。您的模块将自动将路由规则添加到主应用程序,您将能够使用
    /
    路由访问DefaultController的操作


    另一方面,这仍然不是理想的解决方案。这更多的是为了解决Yii2的设计缺陷。如果有人提出更好的解决方案,它将被设置为可接受的答案。

    您完全理解这个问题!然而,虽然这是一个有趣的解决方案,但我真的不喜欢引导其他组件,因为它会给应用程序增加不必要的开销(当不使用模块时)以及在模块使用文档中解释的额外步骤。让我们看看是否有人有其他想法,但我担心你可能是对的,因为这是不可能的。
    namespace your\name\space;
    
    class RouteBootstrap implements \yii\basic\BootstrapInterface {
        public function bootstrap($app) {
            if ($app instanceof \yii\web\Application) {
                $app->urlManager->addRules([
                    ['moduleID/<action>' => 'moduleID/default/<action>'],
                ]);
            }
        }
    }
    
    "extra": {
        "bootstrap": "your\\name\\space\\RouteBootstrap"
    }