Php 获取zf2中的所有模块名称

Php 获取zf2中的所有模块名称,php,zend-framework,zend-framework2,Php,Zend Framework,Zend Framework2,我想列出我的项目中包含的所有模块、控制器和操作,以用于acl。但我不知道如何从zf2获取此类信息。有人知道如何使这项工作成功吗?谢谢:)试试这个 $manager = $this->getServiceLocator()->get('ModuleManager'); $modules = $manager->getLoadedModules(); $loadedModules = array_keys($modules); $skipAct

我想列出我的项目中包含的所有模块、控制器和操作,以用于acl。但我不知道如何从zf2获取此类信息。有人知道如何使这项工作成功吗?谢谢:)

试试这个

$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);
    }
}

您可以从
ModuleManager
获取加载模块的数组

$moduleManager = $serviceManager->get('ModuleManager');
$loadedModules = $moduleManager->getLoadedModules();
$controllerManager = $this->getServiceLocator()->get('ControllerLoader');
foreach ($controllerManager->getCanonicalNames() as $alias) {
    $controller = $controllerManager->get($alias); // This will get you the controller instance
}
对于控制器,您可以从
ControllerManager
检索它们

$moduleManager = $serviceManager->get('ModuleManager');
$loadedModules = $moduleManager->getLoadedModules();
$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);

回答得好。此解决方案中的一个缺陷是,您只从serviceManager而不是工厂检索可调用项。为了得到完美的解决方案,他必须结合你和我答案中的一些想法。我不确定别名是否也列在
getCanonicalNames
中。如果是这样的话,就需要合并可调用项和工厂键。