Kohanaの基本動作覚書
イベントとフックを理解する
Kohanaの動作順序と引掛け(ふっく)の話。
table of contents
Kohanaのファイル読み込み順序
以下、ザクっとKohanaの動作順序について書く。(以下では、'Kohana'というフレームワークにある.htaccessを有効にしているのを前提とする。)
Kohanaは(1)URL要求があると、index.phpを読み込み、index.phpはディレクトリ定数を幾つか設定した後(2)system/core/Bootstrap.phpを読み込み、Bootstrapは、Benchmark.phpとutf8.phpとEvent.phpとKohana.phpを読み込む。
つまりは、旧約聖書みたいなものである。
Bootstrapでの読み込みファイル順序(system/core/ディレクトリ)
Benchmark.php utf8.php Event.php Kohana.php
以後、名前からして明らかなように、Kohana.phpに棲息するClass Kohanaが王様として君臨することになる。
(3)さて、王様は、侍従長のapplication/config.phpの報告を聞き、王国の法を定め、あるいは内政に突っ込み(フック)を入れ始める。
(4)その後、ようやく外交をはじめる。フレームワークの胆ともいえるルーティングの処理に入るわけだ。
- まず、インストール初期状態のままならsystem/config/routes.phpのルーティング情報が設定される(たった一行、__default画面としてwelcomeコントローラーに行けと書かれてあるだけだ)。
- もし、application/config/に、routes.phpをつくってあると上の情報は上書きされる。
- ただしmodules/アプリ名/config/routes.phpでも上書き出来るので、モジュールのroutes.phpを作ってあればモジュールディレクトリだけででルーティングを一括管理出来るわけである。
ルーティングは
routes.phpの例
$config['something/(.*)'] = 'something';
のように書かれる。この例だと、
(1)http://examples.com/something/fooにアクセスされると、controllers/something.phpにあるSomething_Controllerクラスが呼び出され、
(2)初期メソッドとして指定されているindex名のメソッドが動作する。
と、書くとややこしく聞こえるが、クラス名/メソッド名が基本パターンで、メソッド名が省略されるとindex()が呼び出されるというだけだ。
routes.phpの例2
$config['something/(.*)'] = 'something/anything';
なら、anythingメソッドが呼び出される。
左の[]内のルーティングの記法は一種の正規表現。その書き方とかCIのルーティング記法の違い等については、まだよくわからないのでそっとしておく。この手のものは、本家のRuby on RailsWikiPedia を学習してから、考えるべきだと思っている、というのは偉そうで、面倒なので考えないことにしたい(家訓)。
(5)あとは、
- 呼び出されたコントローラークラス/メソッドの入力情報をもとにして
- models/内のクラスを使って
- views/内のファイルがデータを表示して
おしまい。
ここらへんの一連の処理を、applicationディレクトリでやるのか、modules/モジュール名/で処理するのかはお好みなのだが、自分的には、モジュールやるのが紛れがないと思ってる。
なおモジュールの作成法についてはHMVC:モジュールの作り方参照。
だいたいの動作順序がわかったとして、つぎにその順序(イベント)に対するフックについて、ザクっと理解してみる。
実行ステップ(=イベント)各種
イベントといえば、康芳夫WikiPedia に留めを刺す訳だが、常夏野郎にはそのようなあやかし的暗躍は無い。Kohanaは、下図のような順序で、すぱっとスクリプトを実行する。わかりやすい。
system.* が、フックのタイミングをあらわす値となる。
フックをかける
釣り針を落とすためには、2つの点だけ留意しておけばいい。
(1)application/config/config.phpの$config['enable_hooks'] をTRUEに変更すること。
(2)application/hooks/(ないしはmodules/モジュール名/hooks/)内にフック用のファイルを作ること
フック用ファイルには、動作させたいクラス・メソッドを書き、それを上の図のどの段階で動作させるのかをKohanaのEvent::add で指定する。
Kohana本家の文書例は次のようなものである[1]。
hooks/power.phpでつくられたPowerクラスのKohanaメソッドが、閲覧段階system.displayで動作するフック
class Power {
public function Kohana(){
Event::$data = Event::$data.'<!-- Powered by Kohana-->';
}
}
Event::add('system.display', array('Power', 'Kohana'));
CIに比較して、使い勝手はいい。
なお、hooks/のファイルの拡張子は*.phpであるかどうか問わない(下のKohanaクラスのhookファイルの読み込みルーチン参照)。emacsなどでバックアップファイル(~)が作成されていると、それも読み込んでしまい、クラスの二重宣言エラーが出たりするので注意されたい。と、くどく書くのは、ぼくがうろたえたからだ。
core/Kohanaクラスでのhookファイルの読み込み
if (self::config('core.enable_hooks') === TRUE)
{
// Find all the hook files
$hooks = self::list_files('hooks', TRUE);
foreach ($hooks as $file)
{
// Load the hook
include $file;
}
}