ThinkPHP RBAC如何自动获取所有模块的函数2014-04-06 尛雷 之前我写过一个例子,关于ThinkPHP RBAC权限控制的,后来又研究了下,发现在真实的情况中,很多crm,cms等,有需要去获取RBAC所有模块,然后进行权限分配等操作,或者增加删除模块。所以就想了一个思路去实现自动获取ThinkPHP所有的模块大致思路是:1、根据配置文件获取分组2、遍历分组下的Action文件夹中的*Action.class.php3、实例化Action,获取其所有方法,过滤掉tp本身的底层函数,4、小手一挥,数据到手.以下就是具体的代码,其实思路更加重要,我也不能确定我的就是最好的。我也不可能去一行一行的讲解。大家自己有时间可以研究一下。
//生成模块结构信息 app/分组/模块/方法public function fetch_module(){$M = M("Module");$M->query("truncate table module");$app = $this->getAppName();$groups = $this->getGroup();$n=0;foreach ($groups as $group) {$modules = $this->getModule($group);foreach ($modules as $module) {$module_name=$app."://".$group."/".$module;$functions = $this->getFunction($module_name);foreach ($functions as $function) {$data[$n]["app"] = $app;$data[$n]["group"] = $group;$data[$n]["module"] = $module;$data[$n]["function"] = $function;++$n;}}}$M->addAll($data);$this->success("所有分组/模块/方法已成功读取到module表中.");}protected function getAppName(){return APP_NAME;}protected function getGroup(){$result = explode(",",C("APP_GROUP_LIST"));return $result;}protected function getModule($group){if(empty($group))return null;$group_path=LIB_PATH."Action/".$group;if(!is_dir($group_path))return null;$group_path.="/*.class.php";$ary_files = glob($group_path);foreach ($ary_files as $file) {if (is_dir($file)) {continue;}else {$files[] = basename($file,"Action.class.php");}}return $files;}protected function getFunction($module){if(empty($module))return null;$action=A($module);$functions=get_class_methods($action);$inherents_functions = array("_initialize","__construct","getActionName","isAjax","display","show","fetch","buildHtml","assign","__set","get","__get","__isset","__call","error","success","ajaxReturn","redirect","__destruct");foreach ($functions as $func){if(!in_array($func, $inherents_functions)){$customer_functions[]=$func;}}return $customer_functions;}Model表的结构
CREATE TABLE `module` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL COMMENT "名称",`app` varchar(45) DEFAULT NULL COMMENT "项目",`group` varchar(45) DEFAULT NULL COMMENT "分组",`module` varchar(45) DEFAULT NULL COMMENT "模块",`function` varchar(45) DEFAULT NULL COMMENT "方法",`status` varchar(45) DEFAULT NULL COMMENT "状态",PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
本文出自 “尛雷” 博客,请务必保留此出处http://a3147972.blog.51cto.com/2366547/1218183查看本栏目更多精彩内容:http://www.bianceng.cn/webkf/PHP/