0

我正在寻找一种以编程方式获取 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/ 目录,但我希望有更简单的方法。

谢谢,

4

3 回答 3

1

获取控制器文件列表可以使用Kohana::list_files('classes/controller'). 但正如 Michal 已经说过的,控制器/动作和路由之间没有 1:1 的关系。

于 2013-02-18T08:16:51.017 回答
0

恐怕没有任何Kohana::get_controllers()方法可以让您轻松调用以获取各种站点地图。这是因为控制器是动态调用的,即根据请求的 URL 和路由配置 Kohana 检查是否存在控制器(和操作)然后调用它们。Kohana 不会记录所有可用的控制器和可访问的操作。

遍历/application/classes/controllers目录和获取所有文件的列表都不会为您提供所需的结果,因为不仅有要读取的操作(使用Reflection 类可以很容易地完成),而且还有您必须考虑的路线帐户。

正如您所看到的,这可能是一个非常复杂的问题,不能简单地用可以粘贴在这里的代码片段来回答。

如果您决定编写一个脚本来实际创建这样的地图,但是您在途中遇到了问题,那么我们将能够提供更多帮助,否则这个问题太开放了。另外,如果您要编写它,我建议您将其创建为一个模块,您可以将其包含在任何其他项目中并共享它。

于 2013-02-16T09:47:01.017 回答
0

这是我获取所有控制器及其操作的解决方案。我用它来向我们的系统添加权限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;
}
于 2014-04-22T13:49:35.017 回答