home>>PHP FW Kohanaを使う>>Kohanaの基本動作覚書

Kohanaの基本動作覚書

イベントとフックを理解する

Kohanaの動作順序と引掛け(ふっく)の話。

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)その後、ようやく外交をはじめる。フレームワークの胆ともいえるルーティングの処理に入るわけだ。

  1. まず、インストール初期状態のままならsystem/config/routes.phpのルーティング情報が設定される(たった一行、__default画面としてwelcomeコントローラーに行けと書かれてあるだけだ)。
  2. もし、application/config/に、routes.phpをつくってあると上の情報は上書きされる。
  3. ただし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.* が、フックのタイミングをあらわす値となる。

kohana_sequences_eng.png

フックをかける

釣り針を落とすためには、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;
			}
		}













annex
RailsによるアジャイルWebアプリケーション開発 第2版&nbsp;4274066967

RailsによるアジャイルWebアプリケーション開発 第2版 Dave Thomas David Heinemeier Hansson オーム社 2007-10-26
虚人魁人康芳夫 国際暗黒プロデューサーの自伝&nbsp;4054016693