我想列出项目中包含的所有模块,控制器和操作以用于acl目的。但我不知道如何从zf2获取此类信息。任何人都知道如何使这项工作?谢谢你:)
答案 0 :(得分:6)
试试这个,
$manager = $this->getServiceLocator()->get('ModuleManager');
$modules = $manager->getLoadedModules();
$loadedModules = array_keys($modules);
$skipActionsList = array('notFoundAction', 'getMethodFromAction');
foreach ($loadedModules as $loadedModule) {
$moduleClass = '\\' .$loadedModule . '\Module';
$moduleObject = new $moduleClass;
$config = $moduleObject->getConfig();
$controllers = $config['controllers']['invokables'];
foreach ($controllers as $key => $moduleClass) {
$tmpArray = get_class_methods($moduleClass);
$controllerActions = array();
foreach ($tmpArray as $action) {
if (substr($action, strlen($action)-6) === 'Action' && !in_array($action, $skipActionsList)) {
$controllerActions[] = $action;
}
}
echo $loadedModule . "\n";
echo $moduleClass . "\n";
print_r($controllerActions);
}
}
答案 1 :(得分:2)
您可以从ModuleManager
获取已加载模块的数组。
$moduleManager = $serviceManager->get('ModuleManager');
$loadedModules = $moduleManager->getLoadedModules();
对于控制器,您可以从ControllerManager
。
$controllerManager = $this->getServiceLocator()->get('ControllerLoader');
foreach ($controllerManager->getCanonicalNames() as $alias) {
$controller = $controllerManager->get($alias); // This will get you the controller instance
}
ZF2没有内置任何便利方法来检索所有控制器操作。使用一些反射将是你最好的选择。
$reflection = new \ReflectionClass($controller);
$actions = array();
foreach ($reflection->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
$methodName = $method->getName();
if ($methodName == 'getMethodFromAction') {
continue;
}
if (substr_compare($methodName, 'Action', -strlen('Action')) === 0) {
$actions[] = substr($methodName, 0, strlen($methodName) - 6);
}
}
var_dump($actions);