1

一个典型的 Yii2 路由到模块控制器中的任何动作如下:

<moduleID>/<controllerID>/<actionID>

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

<moduleID>/<actionID>

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

4

3 回答 3

1

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

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

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

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

于 2016-08-29T09:50:45.950 回答
1

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

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

您可以通过在模块内设置规则来做到这一点。

bootstrap如果还没有,请将您的模块添加到配置部分。

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

public function bootstrap($app)
{
    if ($app instanceof \yii\web\Application) {
        $app->urlManager->addRules([
            ['your-module/<action>' => 'your-module/controllers-name/<action>'],
        ]);
    }
}
于 2016-08-29T05:40:58.230 回答
0

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

  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 模块使用的技术相同。

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

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

    文档中描述了有关此技巧的更多详细信息。

  3. 从您的vendors目录中删除模块并运行composer update.

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

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

于 2016-08-31T04:56:03.220 回答