>백엔드 개발 >PHP 튜토리얼 >PHP反照小试: 提取控制器的action方法

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

WBOY
WBOY원래의
2016-06-13 10:38:55933검색

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 = [email&#160;protected]{';		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
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.