Yii2:忽略模块路由的控制器ID

时间:2016-08-29 04:28:39

标签: module yii2 url-routing yii2-module

模块控制器中任何操作的典型Yii2路由如下:

<moduleID>/<controllerID>/<actionID>

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

<moduleID>/<actionID>

,而不必覆盖主应用程序的urlManager中的路由

3 个答案:

答案 0 :(得分:1)

如果通过“而不必覆盖主应用程序的urlManager中的路由”,则表示不修改urlManager路由,我认为这是不可能的。

但是,如果你只是指“没有在app的配置文件中添加新的路由规则”就是这样:

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

如果模块尚未存在,请将模块添加到配置的bootstrap部分。

现在在主模块的文件(默认Module.php)中添加:

public function bootstrap($app)
{
    if ($app instanceof \yii\web\Application) {
        $app->urlManager->addRules([
            ['your-module/<action>' => 'your-module/controllers-name/<action>'],
        ]);
    }
}

答案 1 :(得分:1)

除了Bizley的回答,您还可以在模块中使用特定于模块的网址规则创建单独的配置文件,例如:

modules/<moduleID>/config/url-rules.php

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

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

答案 2 :(得分:0)

结合BizleyIStranger的答案,并加上我自己的一些智慧,我想出了一个解决方案。只要你的模块是通过作曲家添加的,这就是你可以做的:

  1. 在您的模块中创建一个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>'],
                ]);
            }
        }
    }
    

    (务必将 moduleID 替换为您的实际模块ID)。这是官方Yii2 Gii模块使用的same technique

  2. 将以下内容添加到您的模块composer.json文件中:

    "extra": {
        "bootstrap": "your\\name\\space\\RouteBootstrap"
    }
    

    有关此技巧的更多详细信息,请参阅documentation

  3. vendors目录中删除该模块并运行composer update

  4. 那就是它。您的模块将自动将路由规则添加到主应用程序,您将能够使用<moduleID>/<actionID>路由访问DefaultController的操作。

    另一方面,这仍然不是理想的解决方案。对于Yii2的设计缺陷来说,这更像是一种解决方法。如果有人提出了更好的解决方案,它将被设置为已接受的答案。