フック――フレームワークコアの拡張

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/hooks/ に配置されている場合、 filepath として単に「 hooks 」を使用します。スクリプトが application/hooks/utilities/ にある場合は、「 hooks/utilities 」を filepath として使用します。末尾にスラッシュは不要です。
  • params スクリプトに渡したい任意のパラメータです。 この項目はオプションです。

PHP 5.3以上で実行している場合は、ラムダ/無名関数 (またはクロージャ) を使用することができます。簡単な構文です:

$hook['post_controller'] = function()
{
        /* ここで何かします */
};

同じフックでの複数の呼び出し

複数のスクリプトを同じフックポイントで使用したい場合、 単に多次元配列として宣言します、このように:

$hook['pre_controller'][] = array(
        'class'    => 'MyClass',
        'function' => 'MyMethod',
        'filename' => 'Myclass.php',
        'filepath' => 'hooks',
        'params'   => array('beer', 'wine', 'snacks')
);

$hook['pre_controller'][] = array(
        'class'    => 'MyOtherClass',
        'function' => 'MyOtherMethod',
        '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() メソッドをオーバーライドします。システム実行の最後で ウェブブラウザに確定ページを送信するために使用されるものです。これにより 独自の方法による表示が可能になります。 CI スーパーオブジェクトへの参照が $this->CI =& get_instance() により必要となること、 そして確定データは $this->CI->output->get_output() を呼び出すことによって利用できるようになることを覚えておいてください。
  • cache_override 出力ライブラリ_display_cache() メソッドのかわりに独自のメソッドを呼び出すことができます。これにより、 独自のキャッシュ表示機構を使用できるようになります。
  • post_system 最終的にレンダリングされるページがブラウザに送られた後、 つまりブラウザに確定データが送信されシステム実行が終了する時に 呼び出されます。