Zend Framework 2:尝试获取模块控制器和操作的列表

时间:2012-09-17 19:24:19

标签: zend-framework2

尝试为我正在开发的ACL模块获取一组模块控制器和操作。仍在学习框架,并尝试从自动加载器或从引导程序存储它的某个地方提取信息。如果不需要,尝试减少其他请求。以下是最终输出所需的示例:

  • 申请(模块)
    • 的IndexController
      • ViewAction
      • EditAction
      • DeleteAction
  • ZfcUser(模块)
    • UserController中
      • 的indexAction
      • 的LoginAction

非常感谢任何帮助。我不反对抓取文件的目录并检查方法的类,但我希望有一个更清洁的解决方案。

2 个答案:

答案 0 :(得分:3)

对于任何给定的请求,您应该只有一个控制器实际加载到内存中(除非您使用诸如forward()之类的东西)。这样做的原因是您将拉出从ControllerManager路由到的特定控制器实例,为您提供一个实例。

如果需要所有控制器的列表,可以内省ControllerManager服务。由于该插件管理器实现扩展了ServiceManager,因此可以调用方法“getRegisteredServices()”,该方法按服务类型提供服务名称列表。从那里,您可以遍历每个并检索每个控制器(因为服务名称可能与类名称没有1:1的关系)。

这会让你成为控制者。

对于操作,这取决于实现。如果控制器是AbstractActionController实现,则在类上使用Reflection来获取方法列表,任何以“Action”结尾的方法都将是一个操作。对于AbstractRestfulController实现,这也是如此,但您还将拥有getList,get,create,update和delete方法。最后,请记住控制器只是实现Zend \ Stdlib \ DispatchableInterface的任何对象;因此,“行动”的想法可能并不总是相关的。 (作为一个例子,我已经构建了许多只定义dispatch()的“页面”控制器和服务端点。)

答案 1 :(得分:1)

你可以使用这个组件来获得你想要的东西:Zend \ Code, 这是一个可以帮助您入门的示例:

public function testGetAllRessources() {
    $sc = new DirectoryScanner();
    $sc->addDirectory('Path/to/Your/Module/src/Module/Controller/');
    $sc->addDirectory('Path/to/Your/SecondModule/src/SecondModule/Controller/');
    foreach ($sc->getClasses(true) as $classScanner) {
        $classname = $classScanner->getName();
        echo 'Controller: ' . $classname . PHP_EOL;
            foreach ($classScanner->getMethods(true) as $method) {
                if($this->endsWith($method->getName(),'Action')) {
                        echo 'Action: ' . $method->getName() . PHP_EOL;
                }
        }
    }
}

function endsWith($haystack, $needle) {
    $length = strlen($needle);
    if ($length == 0) {
        return true;
    }
    return (substr($haystack, -$length) === $needle);
}