<?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 '';
}
}
分享到:
相关推荐
12 牛刀小试:我的第一个容器化应用.pdf
Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器(虽然 Kubernetes 项目也支持这种方式,比如
Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497
例如,常见的数据处理指令(如ADD、SUB)、控制流程指令(如JMP、CALL)以及I/O操作指令等。 2. **寄存器**:了解CPU内部的寄存器,它们是用来临时存储数据和指令的,如AX、BX、CX、DX等通用寄存器,IP(指令指针)...
本项目就是一个很好的例子——“Java小试一个播放音乐器”,它是一个简单的音乐播放程序,专门用于播放wav格式的音频文件。 在Java中实现音乐播放功能,主要涉及到以下几个核心知识点: 1. **音频文件处理**:Java...
本文档《通达信指标公式源码 小试牛刀精髓.doc》主要介绍了如何利用公式进行技术分析,帮助用户在股市中寻找潜在的投资机会。以下是其中涉及的一些关键知识点: 1. **移动平均线(MA)**: - 移动平均线是股票分析...
本文件“通达信指标公式源码小试牛刀.doc”分享了一些自定义的技术指标公式,以下是对这些公式的详细解读: 1. **VAR1**:这是基于N日最低价(LLV)和最高价(HHV)计算的一个动量指标。它通过计算收盘价相对于价格...
"Linux小试牛刀-项目开发"这个主题,很显然,是关于在Linux环境下进行实际项目的经验分享和技能实践。Linux驱动开发是Linux系统编程的一个重要组成部分,它允许硬件设备与操作系统有效地交互。 首先,我们要理解...
新手小试牛刀:爬取天气网数据基本思路分析网页规律获取城市名称获取天气数据保存csv数据完整代码注意事项 基本思路 查看和分析天气网网页规律 获取城市名称(包括中文名和拼音) 按城市/年/月,获取历史天气数据 将...
3. 控制器(Controller):控制器作为模型和视图之间的桥梁,接收用户的输入,调用模型进行处理,并将结果传递给视图进行展示。在Java中,控制器通常是Servlet或Spring MVC框架中的Controller类,它们处理HTTP请求,...
《牛刀小试VC》是一本面向初学者的VC(Visual C++)编程教程,旨在帮助读者快速掌握VC++的基础知识和应用技巧。这本教程以其高清PDF版的形式,为学习者提供了清晰、易读的学习材料,使得学习过程更为愉快且有效。 ...
"牛刀小试C语言基础教学及实践"这套教程显然是为了帮助初学者建立起扎实的C语言基础。 在C语言的学习中,首先会接触到的是基本的语法结构。这包括变量的声明、数据类型(如int、float、char等)、运算符(如算术...
《jQuery小试牛刀》 在Web开发领域,jQuery是一个不可或缺的JavaScript库,它极大地简化了DOM操作、事件处理、动画效果以及Ajax交互等任务。本文将深入探讨jQuery的核心概念和常见用法,帮助读者更好地理解和运用这...
【知识点详解】 1. 营销漏斗理论:在描述中提到的“营销漏斗”,是指潜在客户从认知品牌到最终购买的过程,通常分为曝光与发现、考虑与购买意图、采取行动和复购等阶段。对于刚建立的户外用品电商网站,目标是增加...
【标题】"v2ex的vue小试项目"是一个基于Vue.js框架的实践项目,旨在帮助开发者熟悉Vue.js与PHP后端服务的整合。V2ex是一个知名的互联网技术社区,这个项目可能是为了模拟或重现V2ex的部分功能,提供一个学习和实践的...
### Java Swing 编程实战:图片查看器设计与实现 #### 概述 本文将详细介绍一个基于Java Swing的简易图片查看器的设计与实现过程。该查看器具备基本的图片浏览功能,包括打开文件、切换图片以及关闭文件等操作。...
小试牛刀.exe
**标题:“Dozer小试”** ...通过阅读这个“Dozer小试”的博客和探索"dozer-demo"项目,开发者可以深入理解Dozer的工作原理,掌握其配置和使用方法,从而在自己的项目中有效地利用这一强大的工具。
【标题】"Java画图板小试"是一个关于利用Java编程语言实现简易画图板的教程,适合初学者和对图形界面开发感兴趣的开发者。在这个项目中,我们将学习如何使用Java的Swing库来创建一个基本的图形用户界面,让用户能够...