模块控制器中任何操作的典型Yii2路由如下:
<moduleID>/<controllerID>/<actionID>
我们如何配置/构建我们的模块(只有一个控制器),以便我们可以使用以下路径直接实现其操作:
<moduleID>/<actionID>
,而不必覆盖主应用程序的urlManager中的路由?
答案 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)
结合Bizley和IStranger的答案,并加上我自己的一些智慧,我想出了一个解决方案。只要你的模块是通过作曲家添加的,这就是你可以做的:
在您的模块中创建一个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。
将以下内容添加到您的模块composer.json
文件中:
"extra": {
"bootstrap": "your\\name\\space\\RouteBootstrap"
}
有关此技巧的更多详细信息,请参阅documentation。
从vendors
目录中删除该模块并运行composer update
。
那就是它。您的模块将自动将路由规则添加到主应用程序,您将能够使用<moduleID>/<actionID>
路由访问DefaultController的操作。
另一方面,这仍然不是理想的解决方案。对于Yii2的设计缺陷来说,这更像是一种解决方法。如果有人提出了更好的解决方案,它将被设置为已接受的答案。