Thinkphp6框架获取模块下所有控制器及方法并写入到权限表中

Thinkphp6框架获取模块下所有控制器及方法并写入到权限表中

应功能需求,需读取模块下所有控制器以及对应方法,根据大佬文档整理后记录下来以便后期使用

1:获取模块下所有的控制器和方法写入到权限表

 /**
     * 获取模块下所有的控制器和方法写入到权限表
     */
    public function initperm()
    {

        $modules = array('index');  //模块名称(你需要获取那一个模块下面的控制器和方法)
        $i = 0;
        foreach ($modules as $module) {
            $all_controller = $this->getController($module);//获取所有控制器名称

            foreach ($all_controller as $controller) {
                $all_action = $this->getAction($module, $controller);//获取控制器下所有方法名称
                foreach ($all_action as $action) {
                    $controller = str_replace('Controller', '', $controller);
                    $data[$i]['module'] = $module;
                    $data[$i]['controller'] = $controller;
                    $data[$i]['action'] = $action;

                    //将控制器以及方法入库
                    if (!empty($module) && !empty($controller) && !empty($action)) {
                        $rule_name = $module . '/' . $controller . '/' . $action;
             
                        $rule = db('authrule')->where('name="' . strtolower($rule_name) . '"')->find();
                        if (!$rule) {
                            $idata = array();
                            $idata['module'] = strtolower($module . '/' . $controller);
                            $idata['type'] = "1";
                            $idata['name'] = strtolower($rule_name);
                            $idata['title'] = "";
                            $idata['regex'] = "";
                            $idata['status'] = "1";
                            db('authrule')->insert($idata);
                        }
                    }

                    $i++;
                }
            }
        }
        echo '<pre>';
//        halt($data);
        echo '</pre>';
    }

2:获取所有控制器名称

     /**
     * 获取所有控制器名称
     */
    public function getController($module)
    {
        if (empty($module)) {
            return null;
        }
        $module_path = app()->getRootPath() . '/app/' . $module . '/controller';  //控制器路径
        if (!is_dir($module_path)) {
            return null;
        }
        $module_path .= '/*.php';
        $ary_files = glob($module_path);
        foreach ($ary_files as $file) {
            if (is_dir($file)) {
                continue;
            } else {
                $files[] = basename($file, '.php');
            }
        }
        return $files;
    }

3:获取控制器下所有方法名称

 /**
     * 获取控制器下所有方法名称
     */
    protected function getAction($module, $controller)
    {

        if (empty($controller)) {
            return null;
        }
        $customer_functions = [];
        $file = app()->getRootPath() . '/app/' . $module . '/controller/' . $controller . '.php';
        if (file_exists($file)) {
            $content = file_get_contents($file);
            preg_match_all("/.*?public.*?function(.*?)\(.*?\)/i", $content, $matches);
            $functions = $matches[1];
            //排除部分方法
            $inherents_functions = array('_initialize', '__construct', 'getActionName', 'isAjax', 'display', 'show', 'fetch', 'buildHtml', 'assign', '__set', 'get', '__get', '__isset', '__call', 'error', 'success', 'ajaxReturn', 'redirect', '__destruct', '_empty');
            foreach ($functions as $func) {
                $func = trim($func);
                if (!in_array($func, $inherents_functions)) {
                    $customer_functions[] = $func;
                }
            }
            return $customer_functions;
        } else {
//            \ticky\Log::record('is not file ' . $file, Log::INFO);
            return false;
        }
        return null;
    }

功能已实现,具体可根据本身需求进行对应调整

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值