【问题标题】:Yii2: Omit controller ID from module routeYii2:从模块路由中省略控制器 ID
【发布时间】:2016-09-03 13:31:53
【问题描述】:

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

<moduleID>/<controllerID>/<actionID>

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

<moduleID>/<actionID>

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

【问题讨论】:

    标签: module yii2 url-routing yii2-module


    【解决方案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>'],
            ]);
        }
    }
    

    【讨论】:

    • 你完全理解了这个问题!然而,虽然这是一个有趣的解决方案,但我真的不喜欢引导额外的组件,因为它给应用程序增加了不必要的开销(当不使用模块时)以及在模块使用文档中解释的额外步骤。让我们看看是否有人有其他想法,但恐怕您认为它不可能是对的。
    【解决方案2】:

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

    modules/&lt;moduleID&gt;/config/url-rules.php

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

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

    【讨论】:

      【解决方案3】:

      结合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 模块使用的same technique

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-10
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        相关资源
        最近更新 更多