设为首页 收藏本站
查看: 421|回复: 0

[经验分享] PHP反射小试: 提取控制器的action方法

[复制链接]

尚未签到

发表于 2017-4-8 11:34:39 | 显示全部楼层 |阅读模式
<?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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361915-1-1.html 上篇帖子: TCPDF:用于生成PDF文档的开源PHP类 下篇帖子: php 返回 json 为空 undefined 或者 失败的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表