我正在寻找一种在Kohana应用程序中以编程方式获取控制器列表的方法。
类似于:
public function build_site_map(){
$controllers = Kohana::get_controllers();
echo '<ul>';
foreach($controllers as $controller){
echo '<li><a href="'.URL::base().$controller.'">'.$controller.'</a></li>';
}
echo '</ul>';
}
我意识到我可以读取/application/classes/controllers/目录,但我希望有一种更简单的方法。
谢谢,
使用Kohana::list_files('classes/controller')
可以获得控制器文件的列表。但正如Michal已经说过的,控制器/动作和路线之间并没有1:1的关系。
恐怕没有一个Kohana::get_controllers()
方法可以方便地调用以获得各种站点地图。这是因为控制器是动态调用的,即基于请求的URL和路由配置Kohana检查控制器(和操作)是否存在,然后调用它们。Kohana没有记录所有可用的控制器和可访问的操作。
遍历/application/classes/controllers
目录和获取所有文件的列表都不会给您带来所需的结果,因为不仅有要读取的操作(使用Reflection类可以很容易地完成),而且还有需要考虑的Routes。
正如您所看到的,这可能是一个非常复杂的问题,不能简单地用粘贴在这里的代码片段来回答。
如果你决定写一个脚本来创建这样一个地图,但你在途中遇到了一个问题,我们将能够提供更多帮助,否则这个问题就太开放了。此外,如果您要编写它,我建议您将其创建为一个模块,您可以将其包含在任何其他项目中并共享它。
这里是我获取所有控制器及其操作的解决方案。我用它向我们的系统添加权限https://github.com/open-classifieds/openclassifieds2/
/**
* get all the controllers and the actions that can be used
* @return array
*/
public static function list_controllers()
{
$list_controllers = array();
$controllers = Kohana::list_files('classes/controller');
foreach ($controllers as $controller)
{
$controller = basename($controller,'.php');
$list_controllers[] = $controller;
$class = new ReflectionClass('Controller_Panel_'.$controller);
$methods = $class->getMethods();
foreach ($methods as $obj => $val)
{
if (strpos( $val->name , 'action_') !== FALSE )
{
$list_controllers[$controller][] = str_replace('action_', '', $val->name);
}
}
}
return $list_controllers;
}