要获取控制器的所有祖先模块,可以使用
Controller::getModules()
方法:
$modules = $controller->getModules();
返回此控制器的所有祖先模块。
阵列中的第一个模块是最外层的模块(即
最后一个是最里面的一个。
https://www.yiiframework.com/doc/api/2.0/yii-base-controller#getModules()-detail
Module::getModules()
. 但是,对于未加载的模块,它将返回module config而不是module instance—这在中有说明
$loadedOnly
此方法的参数:
false
,则返回该模块中注册的所有子模块,无论是否加载。
.
$modules = [];
foreach ($module->getModules() as $id => $child) {
if (!$child instanceof Module) {
$child = $module->getModule($id);
}
$modules[] = $child;
}
此外,这将仅返回直接子模块-要获取所有子代,您需要遍历模块树:
/**
* Return all descendants of given module.
*
* @param Module $module
* @return Module[]
*/
$traverse = function (Module $module) use (&$traverse) {
$modules = [];
foreach ($module->getModules() as $id => $child) {
if (!$child instanceof Module) {
$child = $module->getModule($id);
}
$modules[] = $child;
$modules = array_merge($modules, $traverse($child));
}
return $modules;
};
$modules = $traverse($module);