>  기사  >  백엔드 개발  >  codeigniter는 후크 메커니즘을 어떻게 구현합니까?

codeigniter는 후크 메커니즘을 어떻게 구현합니까?

WBOY
WBOY원래의
2016-07-25 08:46:201133검색

codeigniter는 후크 메커니즘을 어떻게 구현하나요? , 도움이 필요한 친구가 참조할 수 있습니다.


저번에 인터뷰를 위해 Xila에 갔을 때 면접관이 나에게 질문을 했던 것을 기억합니다. codeigniter는 후크 메커니즘을 어떻게 구현합니까?
당시에는 답변을 드릴 수 없었지만, 돌아와서 몇 가지 정보를 확인하고 나서야 알게 되어서 여기에 기록해 두겠습니다.
codeigniter 후크는 다음과 같이 구현됩니다. 먼저 프레임워크의 핵심 파일 system/core/CodeIniter.php의 122번째 줄에서 Hooks 클래스를 로드한 다음 파일에서 pre_system(129번째 줄), post_controller_constructor( 295행) 등을 참조하고 이러한 마운트 지점에서 후크 클래스의 _call_hook() 메서드를 실행합니다.

codeigniter의 후크 클래스 소스 코드가 첨부되어 있습니다.

  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. 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. }
  199. $this->in_progress = FALSE;
  200. TRUE 반환;
  201. }
  202. }
  203. // END CI_Hooks 클래스
  204. /* 파일 끝 Hooks.php */
  205. /* 위치: ./system/core/Hooks.php */
复system代码

코드이그나이터를 발행하는 코드이그나이터를 사용하지 않는 방법을 사용하여 완전히 사용할 수 있는 방법을 사용하지 마십시오.听的事件。

如何实现, 코드이그나이터


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.