検索
ホームページバックエンド開発PHPチュートリアルCIフレームワークのソースコード閲覧メモ6 拡張フック Hook.php

CI フレームワークを使用すると、システムのコア コードを変更せずに、システムのコア機能 (キャッシュの書き換え、出力など) を追加または変更できます。たとえば、システムでフックが有効になっている場合 (config.php で $config['enable_hooks'] = TRUE;)、特定のフックを追加すると、システムは特定の時間に特定のスクリプトをトリガーできます。

$hook['post_system'] = array(    'class'     => 'frameLog',    'function'  => 'postLog',    'filename'  => 'post_system.php',    'filepath'   => 'hooks',);

上記のフック A post_system フックが定義されており、最終ページのレンダリング後のスクリプト処理に使用されます (パラメーターの意味は後ほどまたはマニュアルで参照でき、ここではこれ以上の説明は行いません)。

それでは質問です:

  1. フックとは何ですか?
  2. CI でサポートされているフックは何ですか?
  3. CI ではフックはどのように実装されますか?

段階的に見てみましょう。

1. フックとは何ですか?

Baidu 百科事典でのフックの定義は次のとおりです:

フックは実際にはメッセージを処理するプログラム セグメントであり、システム コールを通じてシステムにフックされます。特定のメッセージが送信されるたびに、フック プログラムは宛先ウィンドウに到達する前にメッセージをキャプチャします。つまり、フック関数が最初に制御を取得します。このとき、フック関数はメッセージを処理(変更)したり、処理せずにメッセージの配信を継続したり、メッセージの配信を強制的に終了したりすることができます。

上記の定義からいくつかの点がわかります:

  1. フックはイベント駆動型モデルであり、そのコアは当然のことながらイベントです (CI の pre_system や pre_controller などはすべて特定のイベントです)。
  2. イベント駆動型であるため、次の 2 つの最も重要な手順を含める必要があります: (1) イベントの登録。フックの場合はフックフックの取り付けを指します。 (2). イベントトリガー。特定の時点で特定のフックを呼び出し、対応するフック プログラムを実行します。
  3. イベント駆動型であるため、統一されたフック ポイントを持つ複数の登録イベントもサポートする必要があります。
  4. フックを開始した後、プログラムの流れが変化する可能性があり、適切に処理しないとフックが相互に呼び出す可能性があります。同時に、フックを有効にするとプログラムがある程度複雑になり、デバッグが困難になります。

2. CI の事前定義フック

CI は、次の 7 つの利用可能なプリセット フック ポイントを提供します:

pre_system: システム読み込みの初期段階のフックを指します

pre_controller: コントローラーを呼び出します。 、ルーティングとセキュリティのチェックが完了しました

Post_controller_constructor: コントローラーがインスタンス化された後、メソッド呼び出し前

Post_controller: コントローラーが完全に実行された後

Display_override: ディスプレイを書き換えます

キャッシュオーバーライド:キャッシュを書き換えます

Post_system: 最終ページがクライアントに送信された後

3. CI のフックの実装

CI のフックのコア機能は、Hook コンポーネントによって完了します。コンポーネント画像:

その内:

enabled: フック機能が有効かどうかを示すフラグ。

hooks: システムで有効になっているフックのリストを保存します

in_progress: このフラグはフック間の相互呼び出しによって引き起こされる無限ループを防ぐために使用されることが後でわかります。

_construct は Hook コンポーネントのコンストラクターで、_initialize が呼び出されて初期化作業が完了します

_call_hook: _run_hook を呼び出して、指定されたフック プログラムを呼び出します。 CodeIgniter.php で、_call_hook が実際に外部呼び出しに提供されるインターフェイスであることを以前に見てきました。

_run_hook: フックプログラムを実際に実行する関数

始める前に、事前定義されたフックの構造を投稿しましょう。この構造はソース コード全体に現れる可能性があるため、この構造のパラメータの意味を知る必要があります。

$hook['xx'] = array(    'class'     => 'xx', //钩子调用的类名,可以为空    'function'  => 'xx',//钩子调用的函数名    'filename'  => 'xx',//该钩子的文件名    'filepath'   => 'xx',//钩子的目录    'params'   => 'xx'//传递给钩子的参数);

1).フックコンポーネントの初期化

_initialize 関数はフックコンポーネントを初期化するために使用されます: この関数の主なタスクは次のとおりです:

(1) 設定ファイルでフック関数が有効になっているかどうかを確認します。ロードする必要があるConfig (構成管理コンポーネント):

1

2

3

4

5

6

$CFG =&load_class( '構成' 、 'core');

(2) 定義されたフック リストをロードします

同様に、異なるフックを有効にするために異なる ENVIRONMENT を設定することもできます:

{

1

2

3

4

5

6

7

8

if (define( 'ENVIRONMENT' ) AND is_file (APPPATH . 'config/' '/hooks.php ' ))

{sinclus(apppath。 'config/' .environment。 '/hooks.php'); include (APPPATH. 'config/hooks.php' );

}

(3) フックチェック。フックが設定されていない場合、または設定されたフックの形式が間違っている場合は、処理は行われず、直接終了します。

if ( ! isset( $ook ) OR ! is_array ( $hook ))
return ; }

(1) フックが有効かどうか、および呼び出しフックが事前定義されているかどうかを確認します (有効になっていない場合、または呼び出しフックが存在しない場合は、直接戻ります)。
初期化後、Hook::フックは定義されたフックリストを保存します:

指定されたフックを呼び出す

_call_hook はメインプログラム内で直接呼び出されるインターフェースです。このインターフェースの主なタスクは次のとおりです:

1

2

3

4
if ( ! $this ->enabled OR ! isset( $this ->hooks[ $this ]))

{

FALSE を返します。

(2)。同じフック ポイントに対して複数のフックが有効になっているかどうかを確認します。有効な場合は、

1 if (isset( $this ->hooks[ $that ][0]) AND is_array ( $this ->hooks[ $that ][0])) _run_hook は実際にフックを実行する関数です。

2

3

4

5

6

7

{

それ以外の場合、

(3)。フックは1つだけです。それを実行するのは1つだけです。

$this ->_run_hook( $this -> ;hooks[ $that ]);

3. Run は特定のフック プログラムを実行します

_run_hook 関数は、事前定義されたフック配列をパラメータとして受け取り、次のように実装されます:

(1)。単に配列ではない (当然、有効なフックではない) 場合は、直接返します:

1

2

3
4

if ( ! is_array ( $data ) )

{

return FALSE;

(2). フックの実行ステータスを確認します。

in_progress は、現在のフックの実行ステータスをマークするために使用されます。このパラメータの主な機能は、フック間の相互呼び出しによって引き起こされる無限ループを防ぐことです。

1

2

3

4

if ( $this ->in_progress == TRUE)

{

}

(3).    Hook的合法性检查。

为了方便讲述,我们再次提出一个预定义的hook需要的参数:

$hook['xx'] = array(    'class'     => 'xx', //钩子调用的类名,可以为空    'function'  => 'xx',//钩子调用的函数名    'filename'  => 'xx',//该钩子的文件名    'filepath'   => 'xx',//钩子的目录    'params'   => 'xx'//传递给钩子的参数);

其中class和params是可选参数,其他3个参数为必选参数,如果不提供,则由于无法准确定位到hook程序,只能直接返回:

1

2

3

4

5

6

7

8

9

10

11

if ( ! isset( $data [ 'filepath' ]) OR ! isset( $data [ 'filename' ]))

{

     return FALSE;

}

 

$filepath = APPPATH. $data [ 'filepath' ]. '/' . $data [ 'filename' ];

 

if ( ! file_exists ( $filepath ))

{

     return FALSE;

}

(4). この時点で、フック プログラムの場所は次の 2 つの状況で確認されています。

a 事前定義されたフックのクラス パラメーターが空であり、手続き型呼び出しメソッドが使用されていることを示します。次に、フック ファイル内の関数 xxx を直接実行します

b. クラス パラメータは空ではなく、実際のフック プログラムは $class->$function です。関数パラメータが設定されていない場合、フックは実行できず、直接戻ります:

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

$class = FALSE;

$function = FALSE;

$params = '';

if (isset( $data [ 'クラス' ]) AND $data [ 'class' ] != '' )

{

$class = $data [ 'class' ] }

/* フック関数の取得 */

if ( isset( $ data [ 'function' ]))

{

$function = $data [ 'function' ]

}

/* 渡されたフックパラメータを取得*/

if (isset( $ data [ ' params' ]))

{

$params = $data [ 'params' ];

}

/* クラスも関数も存在しない場合、フック プログラムは見つからず、直接返されます * /

if ( $class === FALSE AND $function === FALSE)

{

return FALSE

}

(5)。上記の 2 つのケースで実行フラグ in_progress を設定し、フックを実行します。

5

6

7 2. //itopic.org/codeigniter-hook.html

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/* 指向性オブジェクトの設定方法 }

$ HOOK = new $class;

$HOOK -> $function ( $params ) }

/* 手続き型実行モード*/

else
{

if ( ! function_exists( $function ) )

{

require ( $filepath ) }

$function ( $params );

最後に忘れずに設定してくださいin_progress フラグは false で、成功した実行フラグを返します:

1

2

$this ->in_progress = FALSE;

return TRUE; ;

フックコンポーネントの完全なソースコード:

参考資料

1. http://codeigniter.org.cn/user_guide/general/hooks.html マニュアル
3. http://codeigniter.org.cn/forums/thread-4947-1-1.html フック実装のレイアウト
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?Apr 10, 2025 am 09:39 AM

PHPでは、特性は方法が必要な状況に適していますが、継承には適していません。 1)特性により、クラスの多重化方法が複数の継承の複雑さを回避できます。 2)特性を使用する場合、メソッドの競合に注意を払う必要があります。メソッドの競合は、代替およびキーワードとして解決できます。 3)パフォーマンスを最適化し、コードメンテナビリティを改善するために、特性の過剰使用を避け、その単一の責任を維持する必要があります。

依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?Apr 10, 2025 am 09:38 AM

依存関係噴射コンテナ(DIC)は、PHPプロジェクトで使用するオブジェクト依存関係を管理および提供するツールです。 DICの主な利点には、次のものが含まれます。1。デカップリング、コンポーネントの独立したもの、およびコードの保守とテストが簡単です。 2。柔軟性、依存関係を交換または変更しやすい。 3.テスト可能性、単体テストのために模擬オブジェクトを注入するのに便利です。

通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。Apr 10, 2025 am 09:37 AM

SplfixedArrayは、PHPの固定サイズの配列であり、高性能と低いメモリの使用が必要なシナリオに適しています。 1)動的調整によって引き起こされるオーバーヘッドを回避するために、作成時にサイズを指定する必要があります。 2)C言語アレイに基づいて、メモリと高速アクセス速度を直接動作させます。 3)大規模なデータ処理とメモリに敏感な環境に適していますが、サイズが固定されているため、注意して使用する必要があります。

PHPは、ファイルを安全に処理する方法をどのように処理しますか?PHPは、ファイルを安全に処理する方法をどのように処理しますか?Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Apr 10, 2025 am 09:33 AM

JavaScriptでは、nullcoalescingoperator(??)およびnullcoalescingsignmentoperator(?? =)を使用できます。 1.??最初の非潜水金または非未定されたオペランドを返します。 2.??これらの演算子は、コードロジックを簡素化し、読みやすさとパフォーマンスを向上させます。

コンテンツセキュリティポリシー(CSP)ヘッダーとは何ですか?なぜ重要なのですか?コンテンツセキュリティポリシー(CSP)ヘッダーとは何ですか?なぜ重要なのですか?Apr 09, 2025 am 12:10 AM

XSS攻撃を防ぎ、リソースのロードを制限し、ウェブサイトのセキュリティを改善できるため、CSPは重要です。 1.CSPはHTTP応答ヘッダーの一部であり、厳格なポリシーを通じて悪意のある行動を制限します。 2。基本的な使用法は、同じ起源からのロードリソースのみを許可することです。 3.高度な使用法は、特定のドメイン名がスクリプトやスタイルをロードできるようにするなど、より微調整された戦略を設定できます。 4。CSPポリシーをデバッグおよび最適化するには、コンテンツセキュリティポリシーレポートのみのヘッダーを使用します。

HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか?HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか?Apr 09, 2025 am 12:09 AM

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

HTTPSとは何ですか、なぜWebアプリケーションにとって重要なのですか?HTTPSとは何ですか、なぜWebアプリケーションにとって重要なのですか?Apr 09, 2025 am 12:08 AM

HTTPSは、HTTPに基づいてセキュリティレイヤーを追加するプロトコルであり、主に暗号化されたデータを介してユーザーのプライバシーとデータセキュリティを保護します。その作業原則には、TLSの握手、証明書の確認、暗号化された通信が含まれます。 HTTPSを実装する場合、証明書管理、パフォーマンスへの影響、および混合コンテンツの問題に注意を払う必要があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。