一个典型的 Yii2 路由到模块控制器中的任何动作如下:
<moduleID>/<controllerID>/<actionID>
我们如何配置/构建我们的模块(只有 1 个控制器),以便我们可以使用以下路线直接执行其操作:
<moduleID>/<actionID>
无需覆盖主应用程序 urlManager 中的路由?
一个典型的 Yii2 路由到模块控制器中的任何动作如下:
<moduleID>/<controllerID>/<actionID>
我们如何配置/构建我们的模块(只有 1 个控制器),以便我们可以使用以下路线直接执行其操作:
<moduleID>/<actionID>
无需覆盖主应用程序 urlManager 中的路由?
除了 Bizley 的回答之外,您还可以在模块中使用特定于模块的 url 规则创建单独的配置文件,例如:
modules/<moduleID>/config/url-rules.php
然后在模块引导方法中加载这些规则(如显示 Bizley)。然后您可以在主应用程序中自动扫描可用的模块和类似的配置文件,并将这些 url 规则与常见的应用程序配置合并。此外,在加载模块时防止重复这些规则也很重要。
我不喜欢这种方法,因为它破坏了“模块化”,但是它可以在没有引导所有模块的情况下工作(这非常容易记忆)。
如果通过“无需覆盖主应用程序的 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>'],
]);
}
}
结合Bizley和IStranger的答案,并加上我自己的一些智慧,我想出了一个解决方案。只要您的模块是通过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>'],
]);
}
}
}
(请务必将moduleID替换为您的实际模块 ID)。这与官方 Yii2 Gii 模块使用的技术相同。
将以下内容添加到您的模块composer.json
文件中:
"extra": {
"bootstrap": "your\\name\\space\\RouteBootstrap"
}
文档中描述了有关此技巧的更多详细信息。
从您的vendors
目录中删除模块并运行composer update
.
而已。您的模块将自动将路由规则添加到主应用程序,您将能够使用<moduleID>/<actionID>
路由访问 DefaultController 的操作。
另一方面,这仍然不是理想的解决方案。这更像是解决 Yii2 设计缺陷的方法。如果有人提出更好的解决方案,它将被设置为接受的答案。