home>>PHP FW Kohanaを使う>>アプリケーションを作る

アプリケーションを作る

ルーティング、コントローラー、モデル

以上で、とりあえずの方向は決ったので、モジュールを作り始めることにする。行き当たりばったりでやるとすれば、やっぱり最初はコントローラーからでしょう。

モジュール名

その前にモジュール名を決めておかなければ。サイト名と一緒にしよう。短縮形の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情報の加工で書く。














annex

補足情報はありません













note