CI_Hooks
CodeIgniterはリクエストを受け付けてから、なんらかのレスポンスをクライアントに返すまで、
いくつかのプロセス(手順)を踏んで処理を行っていきます。
フック機能はそれらのプロセス(手順)の合間に、ユーザ独自の処理を挟み込む機能です。
ユーザ独自の処理を挟み込めるフックポイントには以下の7箇所があり、それぞれ必要な個所に、必要な数の 処理を追加することが可能です。
- pre_system
- pre_controller
- post_controller_constructor
- post_controller
- display_override
- cache_override
- post_system
フロントコントローラ(index.php)から「CodeIgniter.php」に処理が委託され「CI_Benchmark」クラスと 「CI_Hooks」クラスがロードされた直後のフックポイントです。
コントローラクラスがロードされる直前のフックポイントです。
コントローラクラスがロードされコンストラクタメソッドが実行された直後で且つ、 アクションメソッドが処理される直前のフックポイントです。
アクションメソッドの実行後で、「CI_Output」クラスによる レスポンス出力処理の直前のフックポイントです。
CodeIgniterの「CI_Output」クラスによるレスポンス出力処理をユーザ独自のレスポンス出力処理で上書きします。 「CI_Output」の出力処理は実行されなくなります。
CodeIgniterの「CI_Output」クラスによるキャッシュ出力をユーザ独自のキャッシュ出力処理で上書きします。 「CI_Output」のキャッシュ出力処理は実行されなくなります。
CodeIgniterの「CI_Output」クラスによるレスポンス出力処理が終了した後のフックポイントです。 この後に残されたの処理はデータベースの切断処理のみです。(データベースが利用されている場合) つまり、最終処理になります。
フック機能の有効化
フック機能はデフォルトで無効となっています。有効にするには 「application/config/config.php」設定ファイルの 「$config['enable_hooks']」を「TRUE」にする必要があります。
- application/config/config.php
フック機能の設定
フック機能の設定は「application/config/hooks.php」または、「application/config/環境/hooks.php」で行います。
hooks.php
hooks.php設定ファイルに連想配列「$hook」を定義していきます。 フックポイントを示す文字列を添え字(インデックスキー)とすることで各フックポイントの設定が行えます。
$hook['pre_controller']
$hook['post_controller_constructor']
$hook['post_controller']
$hook['display_override']
$hook['cache_override']
$hook['post_system']
$hook[フックポイント]
$hook[フックポイント] に設定する値は以下の添え字(インデックスキー)を持つ連想配列となります。
- filepath
- filename
- class
- function
- params
'filepath' => 'hooks',
'filename' => 'my_pre_system.php',
'class' => 'MyPreSystem',
'function' => 'my_func',
'params' => array('foo', 'bar'),
);
フックプログラムファイルを設置するディレクトリパスを指定します。「application」ディレクトリからの相対パスになります。
ロードするファイル名を指定します。
ロードするクラス名を指定します。上記ファイルに定義されている必要があります。
実行するメソッドを指定します。上記のクラスに定義されている必要があります。
実行するメソッドの引数を配列で指定します。
複数のクラス・メソッドをロード
一つのフックポイントで複数のクラス、または、メソッドをロードするには、複数のフックポイント設定の
連想配列を要素として持つ配列を指定します。
- 複数クラスのロード
- 複数メソッドのロード
'filepath' => 'hooks',
'filename' => 'hoge_pre_system.php',
'class' => 'HogePreSystem',
'function' => 'hoge_func',
'params' => array('aaa', 'bbb'),
);
$hook['pre_system'][] = array(
'filepath' => 'hooks',
'filename' => 'foo_pre_system.php',
'class' => 'FooPreSystem',
'function' => 'foo_func',
'params' => array('abc', 'xyz'),
);
'filepath' => 'hooks',
'filename' => 'my_pre_system.php',
'class' => 'MyPreSystem',
'function' => 'hoge_func',
'params' => array('aaa', 'bbb'),
);
$hook['pre_system'][] = array(
'filepath' => 'hooks',
'filename' => 'my_pre_system.php',
'class' => 'MyPreSystem',
'function' => 'foo_func',
'params' => array('abc', 'xyz'),
);
同一のクラスで複数のメソッドをロードする場合は、それぞれ別インスタンスとなります。
そのため、インスタンス変数の利用には注意が必要です。