读书人

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

发布时间: 2012-08-25 10:06:20 作者: rapoo

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

读书人网 >PHP

热点推荐