用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2060|回复: 7
收起左侧

[权限控制] 请问怎样获取每个controller里面的函数(method)

[复制链接]
发表于 2018-12-22 10:15:55 | 显示全部楼层 |阅读模式
各位大哥,我想编写一个功能是对各用户进行访问权限设置,
需要编写函数,遍历个个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里面的函数就不懂了。
麻烦指教。
发表于 2018-12-23 00:39:11 | 显示全部楼层
用正则试试
 楼主| 发表于 2018-12-23 09:50:46 | 显示全部楼层

这个方法太笨,代码也不好写。
 楼主| 发表于 2018-12-23 22:39:10 | 显示全部楼层
本帖最后由 eemengnan 于 2018-12-23 23:06 编辑

既然没有人回答,我就自己摸索好了,今天写了一下,编写了一个library文件。
希望帮到有同样需求的同学。
library文件  afunction.php
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[1] == 'php') { // PHP文件
                    echo "---> PATH " . $path . " Controler " . $filenameArray[0] . " php <br>";
                    $a = $this->get_methods($path, $filenameArray[0]);
                    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 里面调用的函数
PHP复制代码
 
public function NodeList() {
        $this->load->library('Afunction');
        $this->afunction->get_controllers();
    }
 
 
复制代码

评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

发表于 2018-12-24 10:40:50 | 显示全部楼层
所有类都 require 一次?如果每次请求都全部 require 一次会不会影响性能?
发表于 2018-12-25 14:37:03 | 显示全部楼层
本帖最后由 instrye 于 2018-12-25 14:40 编辑

权限控制不是这样做的,一般都是先有路径 再有模块 路径是存在数据库里的 你这样一次性把所有控制器文件都引入了太浪费资源
 楼主| 发表于 2018-12-29 21:57:15 | 显示全部楼层
instrye 发表于 2018-12-25 14:37
权限控制不是这样做的,一般都是先有路径 再有模块 路径是存在数据库里的 你这样一次性把所有控制器文件都引 ...

我的代码只是初始化使用,自动遍历Controller文件夹里面的各个类及其函数。然后存储在数据库中。
 楼主| 发表于 2018-12-29 22:00:33 | 显示全部楼层
Hex 发表于 2018-12-24 10:40
所有类都 require 一次?如果每次请求都全部 require 一次会不会影响性能?

我需求的只是初始化各个controller及其函数,然后就存储在数据库 。
实际使用中每次都输查询数据库的存储的路径。
当PHP代码发生改变才调用此函数重新刷新数据库信息。

本版积分规则