eemengnan 发表于 2018-12-22 10:15:55

请问怎样获取每个controller里面的函数(method)

各位大哥,我想编写一个功能是对各用户进行访问权限设置,
需要编写函数,遍历个个controller里面的函数,生成完整的访问路径进行勾选。
读取 ci/applicaiton/controllers里面的个个php文件,获取每个php文件里面的函数。
例如 ci/application/controllers/abc.php, 获取里面的函数fun1, fun2, fun3
在页面显示
ip/abc/fun1
ip/abc/fun2
ip/abc/fun3
供管理员勾选。
controllers目录下的文件可以通过简单的php函数遍历,但是怎么加载获取controller里面的函数就不懂了。
麻烦指教。

Hex 发表于 2018-12-23 00:39:11

用正则试试

eemengnan 发表于 2018-12-23 09:50:46

Hex 发表于 2018-12-23 00:39
用正则试试

这个方法太笨,代码也不好写。

eemengnan 发表于 2018-12-23 22:39:10

本帖最后由 eemengnan 于 2018-12-23 23:06 编辑

既然没有人回答,我就自己摸索好了,今天写了一下,编写了一个library文件。
希望帮到有同样需求的同学。
library文件afunction.php

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Afunction {

    // Controllers 主路径 : ci/application/controllers/
    protected $ctrPATH = APPPATH.'controllers'.DIRECTORY_SEPARATOR;
    // php 扩展名
    protected $extNAME = '.php';

    public function get_controllers($path = NULL) {
      // $path   : 相对路径
      if (!is_null($path)) {
            $path = $path . DIRECTORY_SEPARATOR; }      
      // $fullpath : 绝对路径
      $fullpath = $this->ctrPATH . $path;
      if (is_dir($fullpath)) {
            // 子文件数组
            $itemArray = array();
            // 打开目录
            $dir = opendir($fullpath);            
            while ($item = readdir($dir)) {
                // 跳过 . 和 .. 目录
                if ($item == '.' OR $item == '..') { continue; }
                // 判断文件类型:目录?PHP文件?其他
                $filenameArray = explode('.', $item);
                if (count($filenameArray) == 1) { // 目录
                  // 遍历子目录
                  $this->get_controllers($path.$item);
                } elseif ($filenameArray == 'php') { // PHP文件
                  echo "---> PATH " . $path . " Controler " . $filenameArray . " php <br>";
                  $a = $this->get_methods($path, $filenameArray);
                  var_dump($a);
                } else {    /* 其他文件,不做处理 */    }
            }
            // 关闭目录
            closedir($dir);
      }
    }

    // 获取类文件中的函数名称
    public function get_methods($path = NULL, $classname) {
      require_once( $this->ctrPATH . $path . $classname . $this->extNAME );
      return get_class_methods($classname);
    }
}



cotroller 里面调用的函数

public function NodeList() {
      $this->load->library('Afunction');
      $this->afunction->get_controllers();
    }


Hex 发表于 2018-12-24 10:40:50

所有类都 require 一次?如果每次请求都全部 require 一次会不会影响性能?

instrye 发表于 2018-12-25 14:37:03

本帖最后由 instrye 于 2018-12-25 14:40 编辑

权限控制不是这样做的,一般都是先有路径 再有模块 路径是存在数据库里的 你这样一次性把所有控制器文件都引入了太浪费资源

eemengnan 发表于 2018-12-29 21:57:15

instrye 发表于 2018-12-25 14:37
权限控制不是这样做的,一般都是先有路径 再有模块 路径是存在数据库里的 你这样一次性把所有控制器文件都引 ...

我的代码只是初始化使用,自动遍历Controller文件夹里面的各个类及其函数。然后存储在数据库中。

eemengnan 发表于 2018-12-29 22:00:33

Hex 发表于 2018-12-24 10:40
所有类都 require 一次?如果每次请求都全部 require 一次会不会影响性能?

我需求的只是初始化各个controller及其函数,然后就存储在数据库 。
实际使用中每次都输查询数据库的存储的路径。
当PHP代码发生改变才调用此函数重新刷新数据库信息。
页: [1]
查看完整版本: 请问怎样获取每个controller里面的函数(method)