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

では、
XCube_ActionFilter のクラス設計を見てみましょう。この設計が XOOPS Cube の正規バージョンまでに少し変更されるかもしれないことを覚えておいてください。
XCube_Filter_diag
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() は、ほとんどのケースで使われるでしょう。
|