はじめてのKohana (3) : コントローラ
この記事は賞味期限切れです。(更新から1年が経過しています)
「はじめてのKohana」の第三回目です。 前回ご紹介したコントローラをもう少し詳しく紹介します。
コントローラファイル
まずはコントローラファイルのおさらいから。
Kohanaのコントローラは、命名規則に従ってクラス名やアクション名をつけ、 application/class/controller に格納する決まりとなっています。
例えば、あるコンテンツに /foo/bar でアクセスしたい場合。
class Controller_Foo extends Controller {
...
public function action_bar(){
// do something
}
...
}
こんな内容を、application/classes/controller/foo.php に保存すればOKです。
パラメータを受け取る
動的なWebページを生成する為には、URLを介してパラメータを受け取るのが基本です。
他のWebアプリケーションフレームワーク同様、 クラス名・アクション名の後にパラメータを渡して それをコントローラ内で受け取る事が出来ます。
例えば、「記事の詳細をIDを渡して表示させるアクションを作る」場合。
/article/show/12345
このようにして記事のIDを3つ目のパラメータとして渡します。 このIDをコントローラ側で受け取るには、 $this->request->param($key) とします。
class Controller_Article extends Controller {
...
public function action_show(){
$id = $this->request->param("id"); // <= "12345"
// id を元にして何かをする
}
...
}
上のコードではparamメソッドの引数には”id”なる文字列が渡されていますが、 これはルーティングの設定でそのようなキーが設定されているためです。
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'welcome',
'action' => 'index',
));
ルーティングの設定は、bootstrap.php の最後に記載されています。 デフォルトでは下記コードのように、3つ目のパラメータが”id”とされている為、 paramメソッドで引っ張ってこれたわけです。
'(<controller>(/<action>(/<id>)))'
このルーティングは追加・編集する事で様々な事が実現できますが、 その話はまた別の機会に。
before / after
Kohanaのコントローラではコンスラクタは使用できません。(不可能ではないですが、推奨されません) その代替として、アクションメソッドの実行前後に処理されるbefore / after メソッドを使うことが出来ます。
before メソッド
アクションメソッドが実行される前に処理されます。
class Controller_Foo extends Controller {
private $title = null;
public function before(){
$this->title = $this->request->controller() . " - " . $this->request->action();
}
public function action_index(){
echo $this->title; // <= "foo - index"
}
}
after メソッド
アクションメソッドが実行された後に処理されます。
下記はコントローラ名とアクション名から勝手にビューを出力してみる例。 fooコントローラのindexアクションの場合、ビューファイル “foo/index.php” を出力します。
class Controller_Foo extends Controller {
...
public function after(){
$name = $this->request->controller() . "/" . $this->request->action();
$view = View::factory($name);
$this->response->body($view);
}
...
}
cf) Controllers | Kohana User Guide
まとめ
今回はKohanaのコントローラについて少し掘り下げました。 次回は、コントローラと切れない関係にあるルーティングの紹介をします。
» もくじ
コメント