【问题标题】:How to Get List All Classes and Methods from HMVC Codeigniter?如何从 HMVC Codeigniter 中获取所有类和方法的列表?
【发布时间】:2018-12-11 07:38:56
【问题描述】:

我的HMVC 中有一些modules,是否可以在modules 目录中获取所有classesmethods 的列表并放入一个数组中?

谢谢你,对不起我的英语不好

【问题讨论】:

  • 不,您不必编写自己的爬虫...

标签: php arrays codeigniter hmvc


【解决方案1】:

试试这个..创建一个名为“Controllerslist”的库并复制此代码..

class Controllerslist {


    private $CI;


    private $aControllers;


    function __construct() {

        $this->CI = get_instance();

        $this->setControllers();
    }


    public function getControllers() {
        return $this->aControllers;
    }


    public function setControllerMethods($p_sControllerName, $p_aControllerMethods) {
        $this->aControllers[$p_sControllerName] = $p_aControllerMethods;
    }

    private function setControllers() {

        foreach(glob(APPPATH . 'modules/controllers/*') as $controller) {


            if(is_dir($controller)) {

                $dirname = basename($controller);


                foreach(glob(APPPATH . 'modules/controllers/'.$dirname.'/*') as $subdircontroller) {

                    $subdircontrollername = basename($subdircontroller, EXT);


                    if(!class_exists($subdircontrollername)) {
                        $this->CI->load->file($subdircontroller);
                    }

                    $aMethods = get_class_methods($subdircontrollername);
                    $aUserMethods = array();
                    foreach($aMethods as $method) {
                        if($method != '__construct' && $method != 'get_instance' && $method != $subdircontrollername) {
                            $aUserMethods[] = $method;
                        }
                    }
                    $this->setControllerMethods($subdircontrollername, $aUserMethods);                                      
                }
            }
            else if(pathinfo($controller, PATHINFO_EXTENSION) == "php"){

                $controllername = basename($controller, EXT);


                if(!class_exists($controllername)) {
                    $this->CI->load->file($controller);
                }


                $aMethods = get_class_methods($controllername);
                $aUserMethods = array();
                if(is_array($aMethods)){
                    foreach($aMethods as $method) {
                        if($method != '__construct' && $method != 'get_instance' && $method != $controllername) {
                            $aUserMethods[] = $method;
                        }
                    }
                }

                $this->setControllerMethods($controllername, $aUserMethods);                                
            }
        }   
    }
}

之后......在你的控制器中加载这个库

$this->load->library('Controllerslist');
$list = $this->controllerslist->getControllers();
print_r($list);

这对我有用..

【讨论】:

  • 为什么我得到 NULL 结果先生?
  • foreach(glob(APPPATH . 'modules/controllers/*') APPPATH.'modules/controllers' 是否正确,您必须根据 HMVC Codeigniter 中的文件夹进行修改
  • 请检查您的路径,因为它对我有用.. 我的路径是 APPPATH.'modules/mysite/controllers/'。它对我有用..我可以查看您的应用程序文件夹结构..您的控制器在哪个文件夹中??
  • 已解决,先生,我创建了自己的函数.. 我认为这个库无法读取声明的相同类...
  • 好的,谢谢@ModusTollens,其实我是 Stackoverflow 的新手,所以我不知道,谢谢教育我
【解决方案2】:

小更新 Utkarsh Tiwari 对于 HMVC 结构,我们应该首先获取所有模块列表,然后是每个模块的所有控制器..

class ControllerList {
      // Codeigniter reference 
    private $CI;

     // Array that will hold the controller names and methods
    private $aControllers;

    // Construct
    function __construct() {
        // Get Codeigniter instance 
        $this->CI = get_instance();

        // Get all controllers 
        $this->setControllers();

    }

    /**
     * Return all controllers and their methods
     * return array
     */
    public function getControllers() {
        return $this->aControllers;
    }

    /**
     * Set the array holding the controller name and methods
     */
    public function setControllerMethods($p_sControllerName, $p_aControllerMethods) {
         $this->aControllers[$p_sControllerName] = $p_aControllerMethods;
    }

    /**
     * Search and set controller and methods.
     */
    private function setControllers() {

        foreach(glob(APPPATH . 'modules/*') as $modules_all) {

            if(is_dir($modules_all)) {

                $dirname = basename($modules_all);

            foreach(glob(APPPATH . 'modules/'.$dirname.'/controllers/*') as $subdircontroller) {

                    $subdircontrollername = basename($subdircontroller, EXT);


                    if(!class_exists($subdircontrollername)) {
                        $this->CI->load->file($subdircontroller);
                    }

                    $aMethods = get_class_methods($subdircontrollername);
                    $aUserMethods = array();
                    foreach($aMethods as $method) {
                        if($method != '__construct' && $method != 'get_instance' && $method != $subdircontrollername) {
                            $aUserMethods[] = $method;
                        }
                    }
                    $this->setControllerMethods($subdircontrollername, $aUserMethods);                                      
                 }
            }
            else if(pathinfo($controller, PATHINFO_EXTENSION) == "php"){

                $controllername = basename($controller, EXT);


                if(!class_exists($controllername)) {
                    $this->CI->load->file($controller);
                }


                $aMethods = get_class_methods($controllername);
                $aUserMethods = array();
                if(is_array($aMethods)){
                    foreach($aMethods as $method) {
                        if($method != '__construct' && $method != 'get_instance' && $method != $controllername) {
                            $aUserMethods[] = $method;
                        }
                    }
                }

                $this->setControllerMethods($controllername, $aUserMethods);                                
            }
        } 
    }
}

在此之后,您可以简单地获取所有方法和控制器列表..

$this->load->library('controllerlist');
$list = $this->controllerlist->getControllers();
print_r($list);

这对我有用..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多