【问题标题】:List of Kohana controllersKohana 控制器列表
【发布时间】:2013-02-15 23:39:51
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: php kohana kohana-3


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      如您所见,这可能是一个非常复杂的问题,不能简单地用可以粘贴在这里的 sn-p 代码来回答。

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

      【讨论】:

        【解决方案3】:

        这是我获取所有控制器及其操作的解决方案。我用它给我们的系统添加权限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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-29
          • 1970-01-01
          • 1970-01-01
          • 2011-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-21
          相关资源
          最近更新 更多