アプリケーションを作る
ルーティング、コントローラー、モデル
table of contents
以上で、とりあえずの方向は決ったので、モジュールを作り始めることにする。行き当たりばったりでやるとすれば、やっぱり最初はコントローラーからでしょう。
モジュール名
その前にモジュール名を決めておかなければ。サイト名と一緒にしよう。短縮形のbsn でいいな。
コントローラー名をあらかじめ決める。
大げさなものじゃない。コントローラーは一つにしてmodules/bsn/controllers/page.php、でいい。クラス名も同じ。
Page_Controller
class Page_Controller extends Controller {
public $model;
public function __construct()
{
parent::__construct();
モデルを呼び出す
}
public function html() //HTMLファイル用
{
モデルから対象のhtmlファイルの中身とファイルパス情報を得て、
簡易タグのパーサーでHTML変換をしたのち、
VIEWに渡す。
}
public function image() //画像用
{
モデルから対象のimageファイルのパス情報をえて、
そのままKohanaのImageクラスで表示。↓
$image = new Image(imageファイルのフルパス);
$image->render($keep_actions = TRUE);
exit();
}
public function pass() //CSS等の非HTMLテキストファイル用
{
モデルで、fopenして対象ファイルのオブジェクトを得て、
httpのヘッダを送信したのち、fpassthru(オブジェクト)
で表示。
}
}
ルーティングの規則を決める
コントローラ(page)のクラス名メソッド名に対応した規則定義をconfig/routes.phpに書く。Kohanaのルーティングは、_defaultが「ホームページ」を表す予約語になっているけれど、_defaultも他の*.htmlファイルと同じような扱いとする。
config/routes.php
$config['(.*).png$|(.*).jpeg$|(.*).jpg$|(.*).gif$']='page/image'; $config['(.*).rdf$|(.*).xml$|(.*).css$|(.*).js$|(.*).txt$']='page/pass'; $config['_default'] = 'page/html'; $config['.*'] = 'page/html';
URLパスをもとに、モデルとコントローラでデータを処理
URLパスとディレクトリパスが相関しているので、*htmlの処理は単にDOCROOTにURLパスを加えたもので処理できる。
各ファイルの情報定義を書き込む設定ファイル(YAMLファイル)も、
---
それぞれの*htmlが入ってるディレクトリパス/YAMLファイル
で処理すればいい。
パス情報やファイルを読み込む動作などは、Kohanaのクラスやヘルパー(特にuriクラスやURLヘルパー)にそろっているのでそれを使えば簡潔に書ける。
たとえば、
---
http://サイト名/abc/efg/hijk.html
が要求されたら、文書ルート/abc/efg/hijk.htmlファイルを得る次のようなコードを書けばいい。
モデルとコントローラー
class MY_Model extends Model {
public function get_content()
{
return file_get_contents(DOCROOT.url::current());
}
}
class Page_Controller extends Controller {
public $model;
public function __construct()
{
parent::__construct();
$this->model = new MY_Model;
}
public function html()
{
$content = $this->model->get_content();
あとはVIEWに。
}
}
本当は、$this->mode->get_content()なども、VIEWによって処理すべきだろうけど、いまのところ、このほうが視認性がいいので、Controllerでやっている。
以上。おしまい!
・・・・・・・・・というわけにはいかない。これだけでは対応出来ない出来ないケースがあるからだ。例外ケースについて、次の前処理を考える:フックによるURI情報の加工で書く。