フック処理

Acms\Custom\Hookクラス(extension/acms/Hook.php)のもつ各タイミングメソッドに処理を記述することで、特定タイミングで独自の処理を追加して実行できるようになります。

例えば以下のような用途で利用することが出来ます。

  • GETモジュールに渡されるテンプレート文字列の編集
  • POSTモジュール処理後に、データのロギングを追加
  • HTMLレスポンス全体に対するフィルタリング処理
  • グローバル変数の追加

PHPに関する知識が必要です。以降の説明についてもPHPの基礎知識がある前提で進めていますのでご了承ください。

利用方法

まず、config.server.php の HOOK_ENABLE を1にしてフック拡張を有効にします。

define('HOOK_ENABLE', 1);

extension/acms/Hook.php のファイルを修正していきます。

(サンプル) 発行クエリの操作

/**
 * クエリ発行前
 *
 * @param string $sql
 */
public function query(&$sql)
{
    // クエリの acms_blogという文字列を acms_blog2 に置き換え
    // ローカル環境と、テスト環境でドメインを変えたい場合に便利
    if (DOMAIN == 'localhost') {
        $sql = preg_replace('/acms_blog\d*/', 'acms_blog2', $sql);
    }
}

(サンプル) HTTPレスポンスヘッダーの追加

/**
 * header指定
 *
 * @param bool $cache キャッシュ利用
 */
public function header($cache)
{
    // User-Agentで表示するものを分けている場合
    header('Vary: User-Agent');
}

(サンプル) キャッシュルールの追加

/**
 * キャッシュルールに特殊ルールを追加
 *
 * @param string $customRuleString
 */
public function addCacheRule(&$customRuleString)
{
    // デバイスによってキャッシュを分ける場合
    // ここで指定した文字列毎にキャッシュが分けられます。
    $customRuleString = UA_GROUP;
}

(サンプル) 独自グローバル変数の作成

/**
 * グローバル変数の拡張
 *
 * @param array $globalVars
 */
public function extendsGlobalVars(&$globalVars)
{
  // htmlに%{GLOBALVARS} と記載すると、画面で見た時に「グローバルへんすう」と表示
  $globalVars->setField('GLOBALVARS', 'グローバルへんすう');
}

(サンプル) インクルードのパスで使用できるグローバル変数を追加(テンプレートキャッシュ有効時)

/**
 * テンプレートキャッシュ有効時に、
 * インクルードのパスで使用できるグローバル変数を設定
 *
 * ページ毎に値が違うようなグローバル変数を設定しないでください。
 * 値別にキャッシュが作成されるので、値の種類が多いとキャッシュの意味がなくなります。
 *
 * @param array $globalVarNames
 */
public function addGlobalVarsInIncludePath(&$globalVarNames)
{
    $globalVarNames = ['SESSION_USER_AUTH', 'HOGE']; // 例)インクルード文に %{SESSION_USER_AUTH} と %{HOGE} を使えるようにする
}

(サンプル) GETモジュール処理前のテンプレートを変更

/**
 * GETモジュール処理前
 * 解決前テンプレートの中間処理など
 *
 * @param string   &$tpl
 * @param ACMS_GET $thisModule
 */
public function beforeGetFire(&$tpl, $thisModule)
{
    // モジュールのbidが1のときにテンプレートを編集
    if ( $thisModule->bid === 1 ) {
        $tpl = str_replace('foo', 'bar', $tpl);
    }
}

(サンプル) GETモジュールをビルドした後のレスポンス文字列に対するフィルタ

/**
 * ビルド後(GETモジュール解決後)
 * ※ 空白の除去・文字コードの変換・POSTモジュールに対するSIDの割り当てなどはこの後に行われます
 *
 * @param string &$res レスポンス文字列
 */
public function afterBuild(&$res)
{
    // ここでの$resは参照渡しされています
    $res = str_replace('%[ORIGINAL_VAR]%', 'オリジナル変数の置き換え', $res);
}

(サンプル) POSTモジュール処理後の処理追加

/**
 * POSTモジュール処理前
 * $thisModuleのプロパティを参照・操作するなど
 *
 * @param ACMS_POST $thisModule
 */
public function afterPostFire($thisModule)
{
    $moduleName = get_class($thisModule);

    switch($moduleName) {
        case 'ACMS_POST_Entry_Insert':
        case 'ACMS_POST_Entry_Update':
        // エントリー更新の後に何らかの処理を行う
        
        // POSTモジュールの持っていた関連パラメータを参照できます
        var_dump($thisModule)
        
        break;
    }
}