1. 云栖社区>
  2. PHP教程>
  3. 正文

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

作者:用户 来源:互联网 时间:2017-12-01 19:54:11

phpaction控制器反射方法提取小试

PHP反射小试: 提取控制器的action方法 - 摘要: 本文讲的是PHP反射小试: 提取控制器的action方法, <?php/** * Acl 资源查询器* * 在指定的 控制器目录中查找 对应的:* * 控制器 以及其 action 列表 * 并对 控制器 已经action 注释中的 @aclres-finder-desc{ 你的注释 }[e


<?php
/**
* Acl 资源查询器
*
* 在指定的 控制器目录中查找 对应的:
*
* 控制器 以及其 action 列表
* 并对 控制器 已经action 注释中的 @aclres-finder-desc{ 你的注释 }[email protected]
* 做自动提取
*
* 开发者只需在 控制器类文件中 进行对应的标述,即可... 基本就解决了 手动提取的工作了 :-)
*
* @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 protected]{';static $tagfinder_end = '}[email protected]';
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 '';
}}
 

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php , action , 控制器 , 反射 , 方法 , 提取 小试 ,以便于您获取更多的相关知识。