Home  >  Article  >  Backend Development  >  PHP反照小试: 提取控制器的action方法

PHP反照小试: 提取控制器的action方法

WBOY
WBOYOriginal
2016-06-13 13:20:15908browse

PHP反射小试: 提取控制器的action方法

<?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 '';
	}
	
}
?

1 楼 vb2005xu 2012-05-31  
http://www.php10086.com/page/3 不错的博客

2 楼 vb2005xu 2012-05-31  
http://opauth.org/

3 楼 vb2005xu 2012-06-01  
http://www.shejidaren.com/category/css
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn