Module Yii2:从模块路由中忽略控制器ID
模块控制器中任何动作的典型Yi2路径如下所示:Module Yii2:从模块路由中忽略控制器ID,module,yii2,url-routing,yii2-module,Module,Yii2,Url Routing,Yii2 Module,模块控制器中任何动作的典型Yi2路径如下所示: / 我们如何配置/构造我们的模块(只有一个控制器),以便我们可以使用以下路径直接达到其操作: / 无需覆盖主应用程序的urlManager中的路由?如果“无需覆盖主应用程序的urlManager中的路由”是指不修改urlManager路由,我认为这是不可能的 但如果你只是说“没有在应用程序的配置文件中添加新的路由规则”,那么以下是方法: 您可以通过在模块内设置规则来实现 如果还没有模块,请将其添加到配置的引导部分 现在在主模块的文件(default
/
我们如何配置/构造我们的模块(只有一个控制器),以便我们可以使用以下路径直接达到其操作:
/
无需覆盖主应用程序的urlManager中的路由?如果“无需覆盖主应用程序的urlManager中的路由”是指不修改urlManager路由,我认为这是不可能的
但如果你只是说“没有在应用程序的配置文件中添加新的路由规则”,那么以下是方法:
您可以通过在模块内设置规则来实现
如果还没有模块,请将其添加到配置的引导
部分
现在在主模块的文件(default module.php)中添加:
公共函数引导($app)
{
if($app instanceof\yii\web\Application){
$app->urlManager->addRules([
['your-module/'=>'your-module/controllers name/'],
]);
}
}
除了Bizley的答案之外,您还可以在模块中创建单独的配置文件,其中包含模块特定的url规则,例如:
modules//config/url rules.php
然后在模块引导方法中加载这些规则(如show Bizley所示)。
然后,您可以在主应用程序中自动扫描可用的模块和类似的配置文件,并将这些url规则与公共应用程序配置合并。
此外,在加载模块时,防止重复这些规则也很重要
我不喜欢这种方法,因为它打破了“模块化”,但是它可以在不启动所有模块的情况下工作(这非常有助于保持内存)。结合我自己的答案和一些智慧,我想出了一个解决方案。只要您的模块是通过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>'],
]);
}
}
}
有关此技巧的更多详细信息,请参阅供应商
目录中删除模块,然后运行编写器更新
/
路由访问DefaultController的操作
另一方面,这仍然不是理想的解决方案。这更多的是为了解决Yii2的设计缺陷。如果有人提出更好的解决方案,它将被设置为可接受的答案。您完全理解这个问题!然而,虽然这是一个有趣的解决方案,但我真的不喜欢引导其他组件,因为它会给应用程序增加不必要的开销(当不使用模块时)以及在模块使用文档中解释的额外步骤。让我们看看是否有人有其他想法,但我担心你可能是对的,因为这是不可能的。
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>'],
]);
}
}
}
"extra": {
"bootstrap": "your\\name\\space\\RouteBootstrap"
}