经常我们在做项目前后分离情况下需要做后台管理系统用户权限功能,需要扫描控制器下功能块(方法),整理记录下以便后期使用更快捷
直接上代码:
获取指定模块下所有的控制器和方法,注释
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 . '
function getActions($className)
{
//需检查对应模块路径是否正确
$className = 'appadmincontroller\' . $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();
//通过正则获得想要的注释信息
// preg_match_all('/@title(.*?)[rn|n]/', $doc, $method);
//通过正则获得想要的注释信息:因为注释信息格式问题,匹配对应正则
preg_match_all('/@Apidoc\\Title("([Ww]*?)")/', $doc, $method);
return trim($method[1][0] ?? "");
}
function cc_get_desc($doc)
{
$method = array();
$tmp = array();
//通过正则获得想要的注释信息
//preg_match_all('/@method(.*?)[rn|n]/', $doc, $method);
//preg_match_all('/@title(.*?)[rn|n]/', $doc, $tmp);
//通过正则获得想要的注释信息:因为注释信息格式问题,匹配对应正则
preg_match_all('/@Apidoc\\Title("([Ww]*?)")/', $doc, $method);
preg_match_all('/@Apidoc\\Method("([Ww]*?)")/', $doc, $tmp);
return trim($method[1][0] ?? "") . '/' . trim($tmp[1][0] ?? "");
}
注释格式分以下两种:
到此获取指定模块下控制器及注释信息就结束了,具体需求按照自己需求整理



