天天看点

ThinkPHP RBAC如何自动获取所有模块的函数

   之前我写过一个例子,关于ThinkPHP RBAC权限控制的,后来又研究了下,发现在真实的情况中,很多crm,cms等,有需要去获取RBAC所有模块,然后进行权限分配等操作,或者增加删除模块。

   所以就想了一个思路去实现自动获取ThinkPHP所有的模块

   大致思路是:

1、根据配置文件获取分组

2、遍历分组下的Action文件夹中的*Action.class.php

3、实例化Action,获取其所有方法,过滤掉tp本身的底层函数,

4、小手一挥,数据到手.

   以下就是具体的代码,其实思路更加重要,我也不能确定我的就是最好的。我也不可能去一行一行的讲解。大家自己有时间可以研究一下。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

<code>//生成模块结构信息 app/分组/模块/方法</code>

<code>    </code><code>public</code> <code>function</code> <code>fetch_module(){</code>

<code>        </code><code>$M</code> <code>= M(</code><code>'Module'</code><code>);</code>

<code>        </code><code>$M</code><code>-&gt;query(</code><code>"truncate table module"</code><code>);</code>

<code>        </code><code>$app</code> <code>= </code><code>$this</code><code>-&gt;getAppName();</code>

<code>        </code><code>$groups</code> <code>= </code><code>$this</code><code>-&gt;getGroup();</code>

<code>        </code><code>$n</code><code>=0;</code>

<code>        </code><code>foreach</code> <code>(</code><code>$groups</code> <code>as</code> <code>$group</code><code>) {</code>

<code>            </code><code>$modules</code> <code>= </code><code>$this</code><code>-&gt;getModule(</code><code>$group</code><code>);</code>

<code>            </code><code>foreach</code> <code>(</code><code>$modules</code> <code>as</code> <code>$module</code><code>) {</code>

<code>                </code><code>$module_name</code><code>=</code><code>$app</code><code>.</code><code>'://'</code><code>.</code><code>$group</code><code>.</code><code>'/'</code><code>.</code><code>$module</code><code>;</code>

<code>                </code><code>$functions</code> <code>= </code><code>$this</code><code>-&gt;getFunction(</code><code>$module_name</code><code>);</code>

<code>                </code><code>foreach</code> <code>(</code><code>$functions</code> <code>as</code> <code>$function</code><code>) {</code>

<code>                    </code><code>$data</code><code>[</code><code>$n</code><code>][</code><code>'app'</code><code>] = </code><code>$app</code><code>;</code>

<code>                    </code><code>$data</code><code>[</code><code>$n</code><code>][</code><code>'group'</code><code>] = </code><code>$group</code><code>;</code>

<code>                    </code><code>$data</code><code>[</code><code>$n</code><code>][</code><code>'module'</code><code>] = </code><code>$module</code><code>;</code>

<code>                    </code><code>$data</code><code>[</code><code>$n</code><code>][</code><code>'function'</code><code>] = </code><code>$function</code><code>;</code>

<code>                    </code><code>++</code><code>$n</code><code>;                                }</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>        </code><code>$M</code><code>-&gt;addAll(</code><code>$data</code><code>);</code>

<code>        </code><code>$this</code><code>-&gt;success(</code><code>'所有分组/模块/方法已成功读取到module表中.'</code><code>);</code>

<code>    </code><code>}</code>

<code>    </code><code>protected</code> <code>function</code> <code>getAppName(){</code>

<code>        </code><code>return</code> <code>APP_NAME;</code>

<code>    </code><code>protected</code> <code>function</code> <code>getGroup(){</code>

<code>        </code><code>$result</code> <code>= </code><code>explode</code><code>(</code><code>','</code><code>,C(</code><code>'APP_GROUP_LIST'</code><code>));</code>

<code>        </code><code>return</code> <code>$result</code><code>;</code>

<code>    </code><code>protected</code> <code>function</code> <code>getModule(</code><code>$group</code><code>){</code>

<code>        </code><code>if</code><code>(</code><code>empty</code><code>(</code><code>$group</code><code>))</code><code>return</code> <code>null;</code>

<code>        </code><code>$group_path</code><code>=LIB_PATH.</code><code>'Action/'</code><code>.</code><code>$group</code><code>;</code>

<code>        </code><code>if</code><code>(!</code><code>is_dir</code><code>(</code><code>$group_path</code><code>))</code><code>return</code> <code>null;</code>

<code>        </code><code>$group_path</code><code>.=</code><code>'/*.class.php'</code><code>;</code>

<code>        </code><code>$ary_files</code> <code>= </code><code>glob</code><code>(</code><code>$group_path</code><code>);</code>

<code>        </code><code>foreach</code> <code>(</code><code>$ary_files</code> <code>as</code> <code>$file</code><code>) {</code>

<code>            </code><code>if</code> <code>(</code><code>is_dir</code><code>(</code><code>$file</code><code>)) {</code>

<code>                </code><code>continue</code><code>;</code>

<code>            </code><code>}</code><code>else</code> <code>{</code>

<code>                    </code><code>$files</code><code>[] = </code><code>basename</code><code>(</code><code>$file</code><code>,</code><code>'Action.class.php'</code><code>);</code>

<code>        </code><code>return</code> <code>$files</code><code>;</code>

<code>    </code><code>protected</code> <code>function</code> <code>getFunction(</code><code>$module</code><code>){</code>

<code>        </code><code>if</code><code>(</code><code>empty</code><code>(</code><code>$module</code><code>))</code><code>return</code> <code>null;</code>

<code>        </code><code>$action</code><code>=A(</code><code>$module</code><code>);</code>

<code>        </code><code>$functions</code><code>=get_class_methods(</code><code>$action</code><code>);</code>

<code>        </code><code>$inherents_functions</code> <code>= </code><code>array</code><code>(</code>

<code>            </code><code>'_initialize'</code><code>,</code><code>'__construct'</code><code>,</code><code>'getActionName'</code><code>,</code><code>'isAjax'</code><code>,</code><code>'display'</code><code>,</code><code>'show'</code><code>,</code><code>'fetch'</code><code>,</code>

<code>            </code><code>'buildHtml'</code><code>,</code><code>'assign'</code><code>,</code><code>'__set'</code><code>,</code><code>'get'</code><code>,</code><code>'__get'</code><code>,</code><code>'__isset'</code><code>,</code>

<code>            </code><code>'__call'</code><code>,</code><code>'error'</code><code>,</code><code>'success'</code><code>,</code><code>'ajaxReturn'</code><code>,</code><code>'redirect'</code><code>,</code><code>'__destruct'</code>

<code>        </code><code>);</code>

<code>        </code><code>foreach</code> <code>(</code><code>$functions</code> <code>as</code> <code>$func</code><code>){</code>

<code>            </code><code>if</code><code>(!in_array(</code><code>$func</code><code>, </code><code>$inherents_functions</code><code>)){</code>

<code>                </code><code>$customer_functions</code><code>[]=</code><code>$func</code><code>;</code>

<code>        </code><code>return</code> <code>$customer_functions</code><code>;</code>

Model表的结构

<code>CREATE</code> <code>TABLE</code> <code>`module` (</code>

<code>  </code><code>`id` </code><code>int</code><code>(10) unsigned </code><code>NOT</code> <code>NULL</code> <code>AUTO_INCREMENT,</code>

<code>  </code><code>`</code><code>name</code><code>` </code><code>varchar</code><code>(45) </code><code>DEFAULT</code> <code>NULL</code> <code>COMMENT </code><code>'名称'</code><code>,</code>

<code>  </code><code>`app` </code><code>varchar</code><code>(45) </code><code>DEFAULT</code> <code>NULL</code> <code>COMMENT </code><code>'项目'</code><code>,</code>

<code>  </code><code>`</code><code>group</code><code>` </code><code>varchar</code><code>(45) </code><code>DEFAULT</code> <code>NULL</code> <code>COMMENT </code><code>'分组'</code><code>,</code>

<code>  </code><code>`module` </code><code>varchar</code><code>(45) </code><code>DEFAULT</code> <code>NULL</code> <code>COMMENT </code><code>'模块'</code><code>,</code>

<code>  </code><code>`</code><code>function</code><code>` </code><code>varchar</code><code>(45) </code><code>DEFAULT</code> <code>NULL</code> <code>COMMENT </code><code>'方法'</code><code>,</code>

<code>  </code><code>`status` </code><code>varchar</code><code>(45) </code><code>DEFAULT</code> <code>NULL</code> <code>COMMENT </code><code>'状态'</code><code>,</code>

<code>  </code><code>PRIMARY</code> <code>KEY</code> <code>(`id`)</code>

<code> </code><code>) ENGINE=InnoDB </code><code>DEFAULT</code> <code>CHARSET=utf8$$</code>

<code></code>

本文转自 3147972 51CTO博客,原文链接:http://blog.51cto.com/a3147972/1218183,如需转载请自行联系原作者