之前我寫過一個例子,關于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>->query(</code><code>"truncate table module"</code><code>);</code>
<code> </code><code>$app</code> <code>= </code><code>$this</code><code>->getAppName();</code>
<code> </code><code>$groups</code> <code>= </code><code>$this</code><code>->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>->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>->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>->addAll(</code><code>$data</code><code>);</code>
<code> </code><code>$this</code><code>->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,如需轉載請自行聯系原作者