ホームページ  >  記事  >  バックエンド開発  >  codeigniter はフック メカニズムをどのように実装しますか?

codeigniter はフック メカニズムをどのように実装しますか?

WBOY
WBOYオリジナル
2016-07-25 08:46:201099ブラウズ

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 Dev Team
  8. * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
  9. * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (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. * @バージョン 1.0 以降
  13. * @filesource
  14. */
  15. // -------- -------------------------------------------------- --------------
  16. /**
  17. * CodeIgniter Hooks クラス
  18. *
  19. * ハッキングせずに基本システムを拡張するメカニズムを提供します。
  20. *
  21. * @package CodeIgniter
  22. * @subpackage Libraries
  23. * @category Libraries
  24. * @author EllisLab 開発チーム
  25. * @link http: //codeigniter.com/user_guide/libraries/encryption.html
  26. */
  27. class 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', "フッククラスが初期化されました");
  54. }
  55. // ------------------------ ----------------------------------------
  56. /**
  57. * フック設定を初期化します
  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. // 「フック」定義ファイルを取得します。
  72. // フックがない場合は完了です.
  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. if ( ! isset($hook) または ! is_array($hook))
  82. {
  83. return;
  84. }
  85. $this->hooks =& $hook;
  86. $this->enabled = TRUE;
  87. }
  88. // -------- -------------------------------------------------- ----------
  89. /**
  90. * Call Hook
  91. *
  92. * 特定のフックを呼び出します
  93. *
  94. * @access private
  95. * @param string フック名
  96. * @returnmixed
  97. */
  98. function _call_hook($that = '')
  99. {
  100. if ( ! $this->enabled OR ! isset($this-> ;hooks[$that]))
  101. {
  102. return FALSE;
  103. }
  104. if (isset($this->hooks[$that][0]) AND is_array($this->hooks[$that][ 0]))
  105. {
  106. foreach ($this->gt;hooks[$that] as $val)
  107. {
  108. $this->gt;_run_hook($val);
  109. }
  110. }
  111. else
  112. {
  113. $this-> ;_run_hook($this->hooks[$that]);
  114. }
  115. return TRUE;
  116. }
  117. // ---------------------- ------------------------------------------------
  118. /* *
  119. * Run 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. の場合 (! isset($data['filepath']) OR ! isset($data['filename']))
  146. {
  147. return FALSE;
  148. }
  149. $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
  150. if ( ! file_exists($filepath))
  151. {
  152. return FALSE;
  153. }
  154. // -----------------------------------
  155. // クラス/関数名を設定します
  156. // ---- -------------------------------
  157. $class = FALSE;
  158. $function = FALSE;
  159. $params = '' ;
  160. if (isset($data['class']) AND $data['class'] != '')
  161. {
  162. $class = $data['class'];
  163. }
  164. if (isset( $data['function']))
  165. {
  166. $function = $data['function'];
  167. }
  168. if (isset($data['params']))
  169. {
  170. $params = $data[' params'];
  171. }
  172. if ($class === FALSE AND $function === FALSE)
  173. {
  174. return FALSE;
  175. }
  176. // -------------- ----------
  177. // in_progress フラグを設定します
  178. // ------------------- ----------------
  179. $this->in_progress = TRUE;
  180. // ------------------- ----------------
  181. // リクエストされたクラスや関数を呼び出します
  182. // -------------------- ---------------
  183. if ($class !== FALSE)
  184. {
  185. if ( ! class_exists($class))
  186. {
  187. require($filepath);
  188. }
  189. $HOOK = new $class;
  190. $HOOK->$function($params);
  191. }
  192. else
  193. {
  194. if ( ! function_exists ($function))
  195. {
  196. require($filepath);
  197. }
  198. $function($params);
  199. }
  200. $this->in_progress = FALSE;
  201. return TRUE;
  202. }
  203. }
  204. / / END CI_Hooks クラス
  205. /* ファイルの終わり Hooks.php */
  206. /* 場所: ./system/core/Hooks.php */
复制代

コードイグナイタが子機化を実現する方法はあまり好ましくなく、ビューアビューア モードを使用して子機化を実行し、イベントを適切に実行することができます。

どうやって、コードイグナイター
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。