Thinkphp6框架获取指定模块下控制器,方法及注释信息

全屏阅读
  • 基本信息
  • 作者:
  • 作者已发布:925篇文章
  • 发布时间:2023年01月13日 22:09:55
  • 所属分类:PHP+MySql, THINKPHP
  • 阅读次数:433次阅读
  • 标签:

Thinkphp6框架获取指定模块下控制器,方法及注释信息

经常我们在做项目前后分离情况下需要做后台管理系统用户权限功能,需要扫描控制器下功能块(方法),整理记录下以便后期使用更快捷

直接上代码:

获取指定模块下所有的控制器和方法,注释

 /**
     * 获取指定模块下所有的控制器和方法,注释
     */
    public function data()
    {
        //获取指定模块下所有控制器信息
        $result = getControllers('../app/admin/controller');

        //剔除不需要获取方法和注释的控制器,看自己需求
//        $tempArr = array_flip($result);
//        unset($tempArr['Base']);
//        unset($tempArr['Login']);
//        $result = array_flip($tempArr);
        //
        foreach ($result as $k => $v) {
            //获取注释信息
            $info = getActions($v);
            $data = [];
            foreach ($info['methods'] as $kk => $vv) {
                //将字符串分割成数组
                $array = explode('/', $vv);
                var_dump($array);
                die();
                //拿到数据后根据自己的需求写入数据库,以下就不做展示了

            }

        }

    }

以下方法写在公共控制器下的

/**
 * 获取模块下所有控制器信息
 */
function getControllers($dir)
{
    $pathList = glob($dir . '/*.php');
    $res = [];
    foreach ($pathList as $key => $value) {
        $res[] = basename($value, '.php');
    }
    return $res;
}

/**
 * 获取控制器下所有方法信息
 */
function getActions($className)
{
    //需检查对应模块路径是否正确
    $className = '\app\admin\controller\\' . $className;
    $methods = array();
    //获得控制器表头注释
    $header = (new \ReflectionClass($className))->getDocComment();
    $header_msg = cc_header_desc($header);
    //获取方法注释
    $rMethods = (new \ReflectionClass($className))->getMethods();
    foreach ($rMethods as $m) {
        $doc = $m->getDocComment();
        $s = cc_get_desc($doc);
        if ($s != '/') {
            array_push($methods, $m->getName() . '/' . $s);
        }
    }

    $res = [
        'header' => $header_msg,
        'methods'=>$methods
    ];
    return $res;
}

/**
 * 获取控制器注释信息
 */
function cc_header_desc($doc)
{
    $method = array();
    //通过正则获得想要的注释信息
    /**
     * 注释格式
     * @title 部门列表
     */
//    preg_match_all('/@title(.*?)[\r\n|\n]/', $doc, $method);

    //通过正则获得想要的注释信息:因为注释信息格式问题,匹配对应正则
    /**
     * 注释格式
     * @Apidoc\Title("部门列表")
     */
    preg_match_all('/@Apidoc\\\\Title\(\"([\W\w]*?)\"\)/', $doc, $method);

    return trim($method[1][0] ?? "");
}

/**
 * 获取方法注释信息
 */
function cc_get_desc($doc)
{
    $method = array();
    $tmp = array();
    //通过正则获得想要的注释信息
    /**
     * 注释格式
     * @title 部门列表
     */
    //preg_match_all('/@method(.*?)[\r\n|\n]/', $doc, $method);
    //preg_match_all('/@title(.*?)[\r\n|\n]/', $doc, $tmp);

    //通过正则获得想要的注释信息:因为注释信息格式问题,匹配对应正则
    /**
     * 注释格式
     * @Apidoc\Title("部门列表")
     * @Apidoc\Method("POST")
     */
    preg_match_all('/@Apidoc\\\\Title\(\"([\W\w]*?)\"\)/', $doc, $method);
    preg_match_all('/@Apidoc\\\\Method\(\"([\W\w]*?)\"\)/', $doc, $tmp);

    return trim($method[1][0] ?? "") . '/' . trim($tmp[1][0] ?? "");
}

注释格式分以下两种:

    /**
     * 注释格式
     * @title 部门列表
     */

     /**
     * 注释格式:这种是引用了tp6框架apidoc接口文档(接口文档文档地址:https://hgthecode.github.io/thinkphp-apidoc/use/)
     * @Apidoc\Title("部门列表")
     * @Apidoc\Method("POST")
     */

到此获取指定模块下控制器及注释信息就结束了

顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!