Kohana控制器列表

时间:2013-02-15 23:39:52

标签: php kohana kohana-3

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

谢谢,

3 个答案:

答案 0 :(得分:1)

获取控制器文件列表可以使用Kohana::list_files('classes/controller')完成。但正如Michal所说,控制器/行动和路线之间没有1:1的关系。

答案 1 :(得分:0)

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

遍历/application/classes/controllers目录并获取所有文件的列表都不会给你想要的结果,因为不仅要读取动作(使用Reflection class可以很容易地完成),但是你还必须考虑Routes

正如您所看到的,这可能是一个非常复杂的问题,而且无法通过可以粘贴的代码片段来回答这个问题。

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

答案 2 :(得分: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;
}