0

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

  • 应用(模块)
    • 索引控制器
      • 查看动作
      • 编辑动作
      • 删除动作
  • ZfcUser(模块)
    • 用户控制器
      • IndexAction
      • 登录动作

任何帮助将不胜感激。我不反对抓取文件的目录并检查方法的类,但我希望有一个更干净的解决方案。

4

2 回答 2

3

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

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

这让你的控制器。

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

于 2012-09-17T20:08:37.070 回答
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);
}
于 2013-04-21T12:01:25.440 回答