经常我们在做项目前后分离情况下需要做后台管理系统用户权限功能,需要扫描控制器下功能块(方法),整理记录下以便后期使用更快捷
直接上代码:
获取指定模块下所有的控制器和方法,注释
/**
* 获取指定模块下所有的控制器和方法,注释
*/
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")
*/
到此获取指定模块下控制器及注释信息就结束了,具体需求按照自己需求整理