XCube_ActionFilter (1)
このエントリでは、 XCube_ActionFilter
について学びましょう。ActionFilter
は、 mojavi2
から拝借されたアイデアです。あなたが mojavi2
ではなく、 C
もしくはアセンブリを知っているならば、ファンクションポインタを配列にプッシュし、後からこれらを順番に呼び出していくテクニックを覚えているかも知れません。ActionFilter
は、そのテクニックに似ています。Legacy_Controller
は、 XCube_ActionFilter
の様々なサブクラスのインスタンスを作成し、そして、これらのインスタンスを、コントローラのメンバプロパティである
mFilterChain
にプッシュします。
では、 XCube_ActionFilter
のクラス設計を見てみましょう。この設計が XOOPS Cube
の正規バージョンまでに少し変更されるかもしれないことを覚えておいてください。

XCube_ActionFilter
は、 preFilter()
と preBlockFilter()
という 2
つのメンバ関数を持っています。これらの 2
つのメンバーファンクションは、 Legacy_Controller
によって特定のタイミングで呼ばれることになっています。 preFilter()
は、 Legacy_Controller
の executeCommon()
の最初の部分で呼ばれます。それが、 XOOPS2
の common.php
と似ているので、私は executeCommon()
を「コモンプロセス」と呼んでいます。
preFilter()
の中では、データベースインスタンスを使うことができません。なぜなら、このメンバ関数はコモンプロセスのまさに最初の部分だからです。そう、このメンバ関数は、
Legacy_Controller
がデータベースクラスのインスタンスの作成を試みる前に呼ばれます。
preFilter()
は、何のために使われますか ?
あなたは、あなたのロジックをコモンプロセスの最初の部分に挿入するために、それを使うことができます。preFilter()
の時点で Legacy_Controller
が自身のセットアップをほとんど終えていないので、 preFilter()
の用途は制限的かもしれません。あなたは、 preBlockFilter()
の中で XOOPS Cube
のリソースにアクセスするために多くのインスタンスを使うことができますが、
preFilter()
の中ではそれはできません。
従って、あなたは、 XoopsProtector
のような mainfile.php
ハックの代わりに preFilter()
を使うのがよいでしょう。言い換えれば、あなたは、それが preBlockFilter()
のタイミングで呼ばれるには遅すぎるロジックのために preFilter()
を使えばよいのです。
Legacy_Controller
がブロックの準備を始める直前に、 preBlockFilter()
は、呼ばれます。 preBlockFilter()
は便利です。なぜなら、あなたはこのメンバ関数の中では多くの関数および多くのインスタンスを使うことができるからです。例として、データベースインスタンス、または、
XoopsObject
ハンドラによってデータベースにアクセスすることが容易です。恐らく、
preBlockFilter()
は、ほとんどのケースで使われるでしょう。