尝试为我正在开发的ACL模块获取一组模块控制器和操作。仍在学习框架,并尝试从自动加载器或从引导程序存储它的某个地方提取信息。如果不需要,尝试减少其他请求。以下是最终输出所需的示例:
非常感谢任何帮助。我不反对抓取文件的目录并检查方法的类,但我希望有一个更清洁的解决方案。
答案 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);
}