试图为我正在开发的 ACL 模块获取一系列模块控制器和操作。仍在学习框架,并尝试从自动加载器或从引导程序中存储信息的地方提取信息。如果不需要,尝试减少额外的请求。这是我最终输出所需的示例:
- 应用(模块)
- 索引控制器
- 查看动作
- 编辑动作
- 删除动作
- 索引控制器
- ZfcUser(模块)
- 用户控制器
- IndexAction
- 登录动作
- 用户控制器
任何帮助将不胜感激。我不反对抓取文件的目录并检查方法的类,但我希望有一个更干净的解决方案。
试图为我正在开发的 ACL 模块获取一系列模块控制器和操作。仍在学习框架,并尝试从自动加载器或从引导程序中存储信息的地方提取信息。如果不需要,尝试减少额外的请求。这是我最终输出所需的示例:
任何帮助将不胜感激。我不反对抓取文件的目录并检查方法的类,但我希望有一个更干净的解决方案。
对于任何给定的请求,您可能只应该将一个控制器实际加载到内存中(除非您使用诸如 forward() 之类的东西)。这样做的原因是您将从 ControllerManager 中提取路由到的特定控制器实例,从而为您提供一个实例。
如果你想要一个所有控制器的列表,你可以自省 ControllerManager 服务。由于该插件管理器实现扩展了 ServiceManager,因此您可以调用方法“getRegisteredServices()”,该方法按服务类型提供服务名称列表。从那里,您可以遍历每个控制器并检索每个控制器(因为服务名称可能与类名称没有 1:1 的关系)。
这让你的控制器。
对于操作,这取决于实施。如果控制器是 AbstractActionController 实现,则在类上使用反射来获取方法列表,任何以“Action”结尾的方法都将是一个动作。对于 AbstractRestfulController 实现,这也是正确的,但您还将拥有 getList、get、create、update 和 delete 方法。最后,请记住,控制器只是实现 Zend\Stdlib\DispatchableInterface 的任何对象;因此,“行动”的概念可能并不总是相关的。(例如,我构建了许多只定义 dispatch() 的“页面”控制器和服务端点。)
你可以使用这个组件来获得你想要的东西: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);
}