フック - フレームワークコアの拡張
CodeIgniter のフック機能は、コアのファイルをハックすることなく、フレームワークの内部動作に関連付けて、その動作を変更する手段を提供します。 CodeIgniter は、アプリケーションフローチャート のページで図示したような特定の実行プロセスに従って動きます。 しかし、この実行プロセスのどこかの段階で、何かの処理を行いたい場合があるかもしれません。 たとえば、コントローラがロードされる直前あるいは直後に、あるスクリプトを実行したい場合、 あるいは、他のどこかの段階でユーザ作成のスクリプトを起動したい場合などです。
フックの有効化
application/config/config.php ファイルの次の設定項目をセットして、フック機能をアプリケーション全体で有効/無効に設定できます:
$config['enable_hooks'] = TRUE;
フックの定義
フックは application/config/hooks.php ファイルで定義します。各フックは次の例のような配列として指定されます:
$hook['pre_controller'] = array(
'class' => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
Notes:
配列の添字は、利用したいフックポイントの名前になります。上の例では、フックポイントは pre_controller になります。フックポイントのリストは下の方をご覧ください。
フックを定義する連想配列で、次の項目を定義する必要があります:
- class 呼び出したいクラスの名前。クラスの代わりに手続き型の関数を使いたい場合は、空のままにしておきます。
- function 呼び出したいメソッド名 (関数名)。
- filename クラス/メソッド(関数)が含まれるファイル名。
- filepath スクリプトが含まれるディレクトリ名。Note: スクリプトは、application フォルダの中にあるディレクトリに置く必要があり、パスは、application フォルダからの相対パスになります。たとえばスクリプトが application/hooks にあるとき、単に hooks が指定すべきファイルパスになります。スクリプトが application/hooks/utilities にあるときは、hooks/utilities をファイルパスとして用います。末尾にスラッシュをつけないようにしてください。
- params スクリプトに渡したい全パラメータ。この項目はオプションです。
同一フックでの複数呼び出し
ひとつ以上のスクリプトを同じフックポイントで使いたい場合は、次のように、単純に、配列の宣言を多次元にします:
$hook['pre_controller'][] = array(
'class' => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
$hook['pre_controller'][] = array(
'class' => 'MyOtherClass',
'function' => 'MyOtherfunction',
'filename' => 'Myotherclass.php',
'filepath' => 'hooks',
'params' => array('red', 'yellow', 'blue')
);
各配列の後ろにブラケットを忘れないよう留意してください:
$hook['pre_controller'][]
このようにすると、複数スクリプトを同一フックで利用できます。配列を定義した順が実行の順序になります。
フックポイント
以下は、利用できるフックポイントのリストです。
- pre_system
システムの実行の最初に呼ばれます。この時点では、ベンチマークとフッククラスだけがロードされます。他の処理へのルーティングはまだ発生しません。 - pre_controller
コントローラが呼ばれる直前に呼ばれます。すべて基本クラスのロード、ルーティング、そしてセキュリティチェックが終わっています。 - post_controller_constructor
コントローラがインスタンス化された直後で、メソッドの呼び出しが起こる前に呼ばれます。 - post_controller
コントローラが完全に実行された直後に呼ばれます。 - display_override
システムが実行の最後で、処理が終わったページをブラウザに送信するのに使う _display() メソッドをオーバーライドします。 これにより、独自の表示方法が利用できます。処理済みのデータは、$this->output->get_output() を呼べば利用可能ですので、留意しておいてください。 - cache_override
出力クラスの _display_cache() メソッドの代わりに、独自のメソッドを呼び出すことができます。これにより、独自のキャッシュメカニズムを利用することができます。 - post_system
最終のレンダリング後のページがブラウザに送信された後、つまり、ブラウザに処理済みデータが送信されたあとで、システムの実行が終わる時に呼ばれます。