您的位置:首页 > 编程语言 > PHP开发

[置顶] PHP反射小试: 提取控制器的action方法

2016-08-25 17:12 501 查看
<?php
/**
* Acl 资源查询器
*
* 在指定的 控制器目录中查找 对应的:
*
* 控制器 以及其 action 列表
* 并对 控制器 已经action 注释中的 @aclres-finder-desc{ 你的注释 }aclres-finder-desc@
* 做自动提取
*
* 开发者只需在 控制器类文件中 进行对应的标述,即可... 基本就解决了 手动提取的工作了 :-)
*
* @author 色色
* @version 0.1
*
*/
class Pkg_Reflection_AclResource_Searcher {

static function loadControllerList($basepath){
$paths = Core_AppUtils::recursion_glob($basepath,'*.php');
if (empty($paths)) return array();

foreach ($paths as $k => $v){
// 1. 去掉基准路径
$v = str_replace($basepath,'',$v);
// 2. 去掉后缀
$v = preg_replace('/\.php$/i','',$v);
// 3. 拆分过滤
$v = Core_AppUtils::normalize($v,DIRECTORY_SEPARATOR);
if (empty($v)) continue;

$paths[$k] = implode('_',$v);
}

$d = array();
foreach ($paths as $controller){
$d[$controller] = self::getActionListFromControllerClass($controller);
}

return $d;
}

static function getActionListFromControllerClass($controller_name){

static $controllerClassPrefix = null;
if (!$controllerClassPrefix) {
$controllerClassPrefix = Core_App::ini('mvc/web/dispatcher/controllerClassPrefix','Core_Controller_');
}

$clazz = "{$controllerClassPrefix}{$controller_name}";

Core_Autoloader::loadClass($clazz,true);

$obj = new ReflectionClass($clazz);

$d = array();
$publicMethods = $obj->getMethods(ReflectionMethod::IS_PUBLIC);

foreach ($publicMethods as $method){

if (preg_match('/^action/i',$method->name)) {
$action_name = preg_replace('/^action/i','',$method->name);
$rmd = Core_Mvc_Router::resourceEncode($controller_name,$action_name);
$q = array_shift($rmd);
$d[$q] = self::getAclResourceDescription($method->getDocComment());
}
}

return array(
'description' => self::getAclResourceDescription($obj->getDocComment()),
'actions' => $d
);
}

static function getAclResourceDescription($finder){
static $tagfinder_start = '@aclres-finder-desc{';
static $tagfinder_end = '}aclres-finder-desc@';

if (empty($finder)) return '';

$start = stripos($finder,$tagfinder_start);

if ($start){
$end = stripos($finder,$tagfinder_end);

if ($end && $end > $start){
// 只有闭合的标签才行
$start = $start+strlen($tagfinder_start);
return trim(substr($finder,$start,$end-$start));
}

}
return '';
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: