天天看點

ThinkPHP源碼閱讀3------行為擴充

  ThinkPHP的核心采用的架構模式是CBD,也就是核心Core+行為Behavior+驅動Driver,核心也就是整個架構模式的核心,大部分都是一些基類,去規定規則,Behavior是行為,就是在指定的地方調用來完成一些特定的行為功能,而Driver驅動就類似cache緩存驅動,mysqldb 資料庫驅動等,完成功能

  行為在手冊的13.1中說的很詳細.我隻去寫一些執行個體.調用行為的方法.

  調用方法是tags()

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

<code>/**</code>

<code> </code><code>* 處理标簽擴充</code>

<code> </code><code>* @param string $tag</code>

<code> </code><code>*          标簽名稱</code>

<code> </code><code>* @param mixed $params</code>

<code> </code><code>*          傳入參數</code>

<code> </code><code>* @return mixed</code>

<code> </code><code>*/</code>

<code>function</code> <code>tag(</code><code>$tag</code><code>, &amp;</code><code>$params</code> <code>= NULL) {</code>

<code>    </code><code>// 系統标簽擴充</code>

<code>    </code><code>$extends</code> <code>= C ( </code><code>'extends.'</code> <code>. </code><code>$tag</code> <code>);</code>

<code>    </code><code>// 應用标簽擴充</code>

<code>    </code><code>$tags</code> <code>= C ( </code><code>'tags.'</code> <code>. </code><code>$tag</code> <code>);</code>

<code>    </code><code>if</code> <code>(! </code><code>empty</code> <code>( </code><code>$tags</code> <code>)) {</code>

<code>        </code><code>if</code> <code>(</code><code>empty</code> <code>( </code><code>$tags</code> <code>[</code><code>'_overlay'</code><code>] ) &amp;&amp; ! </code><code>empty</code> <code>( </code><code>$extends</code> <code>)) { </code><code>// 合并擴充</code>

<code>            </code><code>//array_unique   移除數組中重複的值</code>

<code>            </code><code>$tags</code> <code>= </code><code>array_unique</code> <code>( </code><code>array_merge</code> <code>( </code><code>$extends</code><code>, </code><code>$tags</code> <code>) );</code>

<code>        </code><code>} </code><code>elseif</code> <code>(isset ( </code><code>$tags</code> <code>[</code><code>'_overlay'</code><code>] )) { </code><code>// 通過設定 '_overlay'=&gt;1 覆寫系統标簽</code>

<code>            </code><code>unset ( </code><code>$tags</code> <code>[</code><code>'_overlay'</code><code>] );</code>

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

<code>    </code><code>} </code><code>elseif</code> <code>(! </code><code>empty</code> <code>( </code><code>$extends</code> <code>)) {</code>

<code>        </code><code>$tags</code> <code>= </code><code>$extends</code><code>;</code>

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

<code>    </code><code>if</code> <code>(</code><code>$tags</code><code>) {</code>

<code>        </code><code>if</code> <code>(APP_DEBUG) {</code>

<code>            </code><code>G ( </code><code>$tag</code> <code>. </code><code>'Start'</code> <code>);</code>

<code>            </code><code>trace ( </code><code>'[ '</code> <code>. </code><code>$tag</code> <code>. </code><code>' ] --START--'</code><code>, </code><code>''</code><code>, </code><code>'INFO'</code> <code>);</code>

<code>        </code><code>// 執行擴充</code>

<code>        </code><code>foreach</code> <code>( </code><code>$tags</code> <code>as</code> <code>$key</code> <code>=&gt; </code><code>$name</code> <code>) {</code>

<code>            </code><code>if</code> <code>(! </code><code>is_int</code> <code>( </code><code>$key</code> <code>)) { </code><code>// 指定行為類的完整路徑 用于模式擴充</code>

<code>                </code><code>$name</code> <code>= </code><code>$key</code><code>;</code>

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

<code>            </code><code>B ( </code><code>$name</code><code>, </code><code>$params</code> <code>);</code>

<code>        </code><code>if</code> <code>(APP_DEBUG) { </code><code>// 記錄行為的執行日志</code>

<code>            </code><code>trace ( </code><code>'[ '</code> <code>. </code><code>$tag</code> <code>. </code><code>' ] --END-- [ RunTime:'</code> <code>. G ( </code><code>$tag</code> <code>. </code><code>'Start'</code><code>, </code><code>$tag</code> <code>. </code><code>'End'</code><code>, 6 ) . </code><code>'s ]'</code><code>, </code><code>''</code><code>, </code><code>'INFO'</code> <code>);</code>

<code>    </code><code>} </code><code>else</code> <code>{ </code><code>// 未執行任何行為 傳回false</code>

<code>        </code><code>return</code> <code>false;</code>

<code>}</code>

tag調用的時候,可以指定覆寫系統行為.之後會調用B函數去執行個體化行為對象.

<code> </code><code>* 執行某個行為</code>

<code> </code><code>*</code>

<code> </code><code>* @param string $name</code>

<code> </code><code>*          行為名稱</code>

<code> </code><code>* @param Mixed $params</code>

<code> </code><code>*          傳入的參數</code>

<code> </code><code>* @return void</code>

<code>function</code> <code>B(</code><code>$name</code><code>, &amp;</code><code>$params</code> <code>= NULL) {</code>

<code>    </code><code>if</code> <code>(</code><code>strpos</code> <code>( </code><code>$name</code><code>, </code><code>'/'</code> <code>)) {</code>

<code>        </code><code>list ( </code><code>$name</code><code>, </code><code>$method</code> <code>) = </code><code>explode</code> <code>( </code><code>'/'</code><code>, </code><code>$name</code> <code>);</code>

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

<code>        </code><code>$method</code> <code>= </code><code>'run'</code><code>;</code>

<code>    </code><code>$class</code> <code>= </code><code>$name</code> <code>. </code><code>'Behavior'</code><code>;</code>

<code>    </code><code>if</code> <code>(APP_DEBUG) {</code>

<code>        </code><code>G ( </code><code>'behaviorStart'</code> <code>);</code>

<code>    </code><code>$behavior</code> <code>= </code><code>new</code> <code>$class</code> <code>();</code>

<code>    </code><code>$behavior</code><code>-&gt;</code><code>$method</code> <code>( </code><code>$params</code> <code>);</code>

<code>    </code><code>if</code> <code>(APP_DEBUG) { </code><code>// 記錄行為的執行日志</code>

<code>        </code><code>G ( </code><code>'behaviorEnd'</code> <code>);</code>

<code>        </code><code>trace ( </code><code>$name</code> <code>. </code><code>' Behavior ::'</code> <code>. </code><code>$method</code> <code>. </code><code>' [ RunTime:'</code> <code>. G ( </code><code>'behaviorStart'</code><code>, </code><code>'behaviorEnd'</code><code>, 6 ) . </code><code>'s ]'</code><code>, </code><code>''</code><code>, </code><code>'INFO'</code> <code>);</code>

B函數可以執行個體化行為對象,并且傳入行為需要的參數.行為需要的參數可以在配置檔案config.php中更改.并且會覆寫行為中的預設參數.

行為的基類在Lib/Conf/Behavior.class.php中

protected $options =  array(); 儲存行為的參數

__construct    初始化類,參數指派.   主要就是指派,如果在config.php中存在的話,就用config.php中得覆寫.

__get          擷取參數     擷取行為參數

run             行為唯一執行入口

在B函數中,也可以手動指定參數執行入口,方法是B('類名/方法名')的方式

預設的行為有:

CheckRoute

檢測路由,路由比對

ContentReplace

模闆内容輸出替換

ParseTemplate

模闆解析

ReadHtmlCache

靜态緩存讀取

ShowPageTrace

頁面Trace顯示

ShowRuntime

運作時間顯示

TokenBuild

表單令牌生成

WriteHtml

靜态緩存寫入

擴充行為有

AgentCheck

代理檢測

BrowserCheck

浏覽器檢測,防重新整理

CheckActionRoute

操作路由檢測

CheckLang

語言檢測,并且自動加載語言包

CronRun

自動任務

FireShowPageTrace

将Trace輸出到firefox的firebug

RobotCheck

機器人檢測(就是檢測百度蜘蛛等)

Upgrade

自動更新提示行為

現在寫一個例子,大家就可以了解了.

在App.class.php中,App::run的方法裡,有一個調用應用初始化标簽的地方.

<code>     </code><code>* 運作應用執行個體 入口檔案使用的快捷方法</code>

<code>     </code><code>* @access public</code>

<code>     </code><code>* @return void</code>

<code>     </code><code>*/</code>

<code>    </code><code>static</code> <code>public</code> <code>function</code> <code>run() {</code>

<code>        </code><code>// 項目初始化标簽</code>

<code>        </code><code>tag(</code><code>'app_init'</code><code>);</code>

<code>        </code><code>App::init();</code>

<code>        </code><code>// 項目開始标簽</code>

<code>        </code><code>tag(</code><code>'app_begin'</code><code>);</code>

<code>        </code><code>// Session初始化</code>

<code>        </code><code>session(C(</code><code>'SESSION_OPTIONS'</code><code>));</code>

<code>        </code><code>// 記錄應用初始化時間</code>

<code>        </code><code>G(</code><code>'initTime'</code><code>);</code>

<code>        </code><code>App::</code><code>exec</code><code>();</code>

<code>        </code><code>// 項目結束标簽</code>

<code>        </code><code>tag(</code><code>'app_end'</code><code>);</code>

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

現在在項目/Lib/Behavior裡建立一個AppinitBehavior.class.php

<code>&lt;?php</code>

<code>class</code> <code>AppinitBehavior </code><code>extends</code> <code>Behavior{</code>

<code>    </code><code>function</code> <code>run(&amp;</code><code>$param</code><code>){</code>

<code>        </code><code>echo</code> <code>'應用開始了'</code><code>;</code>

然後在項目/Conf/tags.php裡

<code>return</code> <code>array</code><code>(</code>

<code>    </code><code>'app_init'</code><code>=&gt;</code><code>array</code><code>(</code>

<code>        </code><code>'Appinit'</code>

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

<code>);</code>

       這樣,在運作項目的時候,則會都輸出應用開始了.非常友善.如果要修改,擴充,都直接修改類或者擴充類即可,不需要修改源代碼,擴充性非常好.

本文轉自 3147972 51CTO部落格,原文連結:http://blog.51cto.com/a3147972/1413619,如需轉載請自行聯系原作者