首頁 > 後端開發 > php教程 > codeigniter是如何實現鉤子機制的?

codeigniter是如何實現鉤子機制的?

WBOY
發布: 2016-07-25 08:46:20
原創
1166 人瀏覽過

codeigniter是如何實現鉤子機制的? ,有需要的朋友可以參考下。


記得上一次去到喜啦面試,面試官問我一個問題:codeigniter是如何實現鉤子機制的?
當時答不上來,後來回來之後查了一些資料才明白,所以在這裡記錄一下:
codeigniter的鉤子是這樣實現的:首先在框架的核心檔案system/core/CodeIniter.php檔案的122行,載入Hooks類,接著在該檔案中定義了幾個掛載點,例如pre_system(129行) 、post_controller_constructor(295行)等,並在這些掛載點上面執行hooks類別的_call_hook() 方法。

另附codeigniter的hooks類別的原始碼:

  1. /**
  2. * CodeIgniter
  3. *
  4. * PHP 5.1.6 或更高版本的開源應用程式開發框架
  5. *
  6. * @package CodeIgniter
  7. * @author EllisLab 開發團隊
  8. * @copyright 版權所有(c) 2008 - 2014,EllisLab, Inc.
  9. * @copyright 版權所有(c) 2014 - 2015,不列顛哥倫比亞理工學院(http://bcit.ca/)
  10. * @ license http ://codeigniter.com/user_guide/license.html
  11. * [url=home.php?mod=space&uid=17823]@LINK[/url] http://codeigniter.com
  12. * @since版本1.0
  13. * @filesource
  14. */
  15. // --------------------------------------------- ----------- ----------------------------
  16. /**
  17. * CodeIgniter Hooks 類別
  18. *
  19. * 提供一個無需駭客即可擴展基礎系統的機制。
  20. *
  21. * @package CodeIgniter
  22. * @subpackage Libraries
  23. * @category庫
  24. * @author EllisLab 開發團隊
  25. * @link http://codeigniter.com/user_user_f libraries/encryption.html
  26. */
  27. 類CI_Hooks {
  28. /**
  29. * 決定鉤子是否啟用
  30. *
  31. * @var bool
  32. */
  33. var $enabled = FALSE;
  34. /**
  35. * config/hooks.php 中設定的所有鉤子清單
  36. *
  37. * @var array
  38. */
  39. var $hooks = array();
  40. /**
  41. * 確定鉤子是否正在進行,用於防止無限循環
  42. *
  43. * @var bool
  44. */
  45. var $in_progress = FALSE;
  46. /**
  47. * 建構子
  48. *
  49. */
  50. function __construct()
  51. {
  52. 🎜> $this->_initialize();
  53. log_message('debug', "Hooks 類別初始化");
  54. }
  55. // ------------ ---------- ---------------------------------------- ------------------
  56. /**
  57. * 初始化 Hooks 偏好設定
  58. *
  59. * @access private
  60. * @return void
  61. */
  62. function _initialize()
  63. {
  64. $CFG =& load_class('Config', 'core');
  65. // 如果鉤子是未在設定檔中啟用
  66. // 沒有什麼可做的
  67. if ($CFG-> item('enable_hooks') == FALSE)
  68. {
  69. return;
  70. }
  71. // 取得「hooks」定義檔。
  72. // 如果沒有 hooks,我們就完成了。
  73. if (define('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
  74. {
  75. include(APPPATH.'config/'. ENVIRONMENT.'/hooks.php');
  76. }
  77. elseif (is_file(APPPATH.'config/hooks.php'))
  78. {
  79. include(APPPATH.'config/hooks.php' );
  80. }
  81. 如果( ! isset($hook) 或! is_array($hook))
  82. {
  83. return;
  84. }
  85. $this->hooks =& $hook;
  86. $this->enabled = TRUE;
  87. }
  88. // ----------------- ----------------------- --------------------------- -
  89. /**
  90. * 呼叫 Hook
  91. *
  92. * 呼叫特定的 hook
  93. *
  94. * @access private
  95. * @param string 鉤子名稱
  96. * @return mix
  97. */
  98. 函數_call_hook($which = '')
  99. {
  100. if ( ! $this->enabled OR ! isset($this- >hooks[$which]))
  101. {
  102. return FALSE;
  103. }
  104. if (isset($this->hooks[$which][0]) AND is_array($this ->hooks[$which][0]))
  105. {
  106. foreach ($this->hooks[$which] as $val)
  107. {
  108. $this->_run_hook($val) ;
  109. }
  110. }
  111. else
  112. {
  113. $this->_run_hook($this->hooks[$which]);
  114. }
  115. return TRUE;
  116. }
  117. // ---- ---------------------------------- ---------------- --------------
  118. /**
  119. * 運行 Hook
  120. *
  121. * 運行特定鉤子
  122. *
  123. * @access private
  124. * @param array 鉤子詳細資訊
  125. * @return bool
  126. */
  127. function _run_hook( $data)
  128. {
  129. if ( ! is_array($ data))
  130. {
  131. return FALSE;
  132. }
  133. // --------- ---------------- ----------
  134. // 安全- 防止失控循環
  135. // --------- ----------------- ------------
  136. // 如果被呼叫的腳本碰巧有相同的
  137. / / 鉤子調用,則可能會發生循環
  138. if ($this->in_progress == TRUE)
  139. {
  140. return;
  141. }
  142. // --- --------------- -----------------
  143. // 設定檔案路徑
  144. // ----- --------------- ---------------
  145. if ( ! isset($data['檔案路徑'])或! isset($data['檔名']))
  146. {
  147. return FALSE; }
  148. $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
  149. if ( ! file_exists($filepath))
  150. {
  151. return FALSE;
  152. }
  153. // -------------------------------- ---
  154. // 設定類別/函數名稱
  155. // -------------------------------- ---
  156. $class = FALSE;
  157. $function = FALSE;
  158. $params = '';
  159. if (isset($data['class']) AND $data['class'] != '')
  160. {
  161. $class = $data['class'];
  162. }
  163. if (isset($data['function' ) ]))
  164. {
  165. $function = $data['function'];
  166. }
  167. if (isset($data['params']))
  168. {
  169. $params = $data['params'];
  170. }
  171. if ($class === FALSE AND $function === FALSE)
  172. {
  173. return FALSE
  174. }
  175. // --------------------------------------- -----------
  176. //設定in_progress 標誌
  177. // -------------------------- ---------
  178. $this->in_progress = TRUE;
  179. // ------------------- -------------- --
  180. // 呼叫請求的類別和/或函數
  181. // ---------------- -------------- -----
  182. if ($class !== FALSE)
  183. {
  184. if ( ! class_exists($class))
  185. {
  186. require($filepath);
  187. }
  188. $HOOK = new $class;
  189. $HOOK->$function($params) ;
  190. }
  191. else
  192. {
  193. if ( !function_exists($function))
  194. {
  195. require($filepath);
  196. }
  197. $function ($params); }
  198. $this->in_progress = FALSE;
  199. 回傳TRUE;
  200. }
  201. }
  202. // END CI_Hooks class
  203. /* Hooks.php 檔案結尾*/
  204. /* 位置:./system/core/Hooks.php */
複製程式碼
可以看出codeigniter實現鉤子機制的方式不夠優雅,其實完全可以使用觀察者模式來實現鉤子機制,將掛載點當做監聽的事件。

如何實現,codeigniter

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板