本文執行個體講述了CodeIgniter鉤子用法。分享給大家供大家參考,具體如下:
CodeIgniter執行流程圖中有7個橢圓的框,這表示在執行的過程中埋了7個鉤子。那先來看看什麼是鉤子?
網上找到的兩段文字:
鉤子的完整實現應該叫事件驅動。事件驅動分為兩個階段,第一個階段是註冊事件,目的是給未來可能發生的“事件”起一個名字,簡單的實現方法是用單例模式產生一個持久的對象或者註冊一個全域變數,然後將事件名稱,以及該事件對應的類與方法插入全域變數即可。也就是掛載一個鉤子。
第二個階段是觸發事件,本質上就是在事件的全域變數中查詢要觸發的事件名稱,然後找到註冊好的類與方法,執行個體化並運行。這樣子就可以擺脫傳統方式中程式必須按順序的規則,進一步實現解除耦合的目的。
鉤子函數可以截獲並處理其他應用程式的訊息。每當特定的訊息發出,在沒有到達目的視窗前,鉤子程式就先捕獲該訊息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該訊息,也可以不作處理而繼續傳遞該訊息,還可以強制結束訊息的傳遞。
可以看到:
1、鉤子函數是預設並在特定的條件下觸發的。
2、鉤子函數接管程式後可以影響到程式的走向。
CI預設鉤子
CI中設定了7個鉤子,鉤子與鉤子之間相對獨立。前3個鉤子是在執行個體化之前設定的,意味著無法使用get_instance執行個體,要使用已執行個體化的類需要global。7個鉤子的作用手冊上說的比較清楚了,可以重寫緩衝輸出、可以對輸出進行處理等。
如何觸發CI鉤子?
CI在設定檔中設定了鉤子開關,要使用鉤子首先得開啟該開關,然後配置config/hook.php中的hook數組,比如設定post_controller_constructor鉤子:
$hook['post_controller_constructor'] = array( 'class' => 'Hook', 'function' => 'post_controller_constructor', 'filename' => 'Hook.php', 'filepath' => 'hooks', 'params' => array('beer', 'wine', 'snacks'));
當控制器執行個體化之後,調用action之前就會觸發去執行hooks目錄下的Hook.php中的post_controller_constructor方法。我們可以在該方法中做一些處理。
鉤子的應用
到目前為止還未體會到CI鉤子的絕妙之處,查看網上有一些應用CI鉤子來實現許可權控制的程式,即在post_controller_constructor做許可權判斷,由於這個鉤子就好比一個建構函式,在建構函式裡判斷接下來要執行的方法是否有許可權,確實可行。但這個功能也完全可以放在MY_Controller中去實現,甚至會更好。因為CI的鉤子是全域的,不管是前台還是後台都會啟動該鉤子,雖然說這個鉤子程式可以做判斷,但這裡判斷不一定是最好的。前面提到過MY_Controller中不同模組公用控制器分開,前台後台繼承不同的控制器,如果我只需要對後台進行許可權控制,完全可以直接在後台公用控制器中來實現,不影響到前台,只對需要的部分做控制。
這裡有個非CI中的例子,思維是一樣的。合作渠道的使用者登入註冊功能,有很多的合作方,不同的合作方需要註冊的基本資料相同,但每個合作方可能會有一些特殊的欄位或者不同的校正方式。
很多時候碰到問題我們都可以放到日常生活中來看。以註冊處理邏輯為例,可以看看其中有個流程是不變的。接受參數->註冊資料之前處理->註冊->註冊資料之後處理。變化的是什嗎?每一步都可能變化,但流程不變化。所以可以對前、後、處理等相關地方設定鉤子,把處理的邏輯分發到特定的情況下去,下面有個參考圖,具體的如何設定鉤子還需要根據項目來:
事實也證明這種方式是可行的,合作方雖然很多,但是也可以分組,上百個註冊頁面很容易就實現了。所以利用鉤子處理這種流程不變,而中間的某個步驟變化多端的需求是很方便的。
簡單點說, 鉤子就是特定條件下執行一段程式;再簡單點,鉤子就是實現解除if判斷的一種方式。
過多的if判斷會導致程式難以閱讀和維護,而通過鉤子的處理可以讓程式更靈活。鉤子有一定的觸發條件,條件可以是配置、從資料庫讀取,或者通過一些技術來實現,比如反射等,使用鉤子可以達到解耦的目的。
更多關於CodeIgniter相關內容感興趣的讀者可查看本站專題:《codeigniter入門教程》和《CI(CodeIgniter)架構進階教程》
希望本文所述對大家基於CodeIgniter架構的PHP程式設計有所協助。