backend/rf-article/adv/edit
根据历史经验,此路由对应的路径应该是 addons/RfArticle/backend/controllers/AdvController/actionEdit
但插件中并没有这个文件
开启断点调试进行跟踪
定位到 vendor/yiisoft/yii2/base/Module.php line 522 行,这里创建了controller
$parts = $this->createController($route);
F7进入方法内部
该文件的586行 存在一个 getModule($id)方法。进入该方法
if (isset($this->_modules[$id])) {
if ($this->_modules[$id] instanceof self) {
return $this->_modules[$id];
} elseif ($load) {
Yii::debug("Loading module: $id", __METHOD__);
/* @var $module Module */
$module = Yii::createObject($this->_modules[$id], [$id, $this]);
$module->setInstance($module);
return $this->_modules[$id] = $module;
}
}
这里通过类的私有属性_modules获取module信息
跟踪Module的私有变量如何生成
把该类里所有设置 _modules的方法都加上断点。
跟踪到文件 common/components/Init.php line 68
Yii::$app->setModules($this->getModulesByAddons());
跟踪到参数调用的方法
这里获取了所有已经安装的插件
if ($this->id == AppEnum::BACKEND && $addon['is_merchant_route_map'] == true) {
$app_id = $merchant;
}
第97行,判断,如果是后台,并且设置了数组中的 is-merchant_route_map为true时,会替换app_id
也即将默认的backend/controllers 替换为了 merchant/controllers
也即设置新插件时候的这一个选项作用