FuelPHPをやってみる (10) - ViewModelを使ってみる -
ViewModelを使えば、本来コントローラーから値をセットしてビューで表示すると言ったような処理をViewModelに任せる事でコンポーネント化?のように出来る模様
fuel/app/classes/view/sample.php
<?php
class View_Sample extends ViewModel {
public function view() {
$title = $this->_view->get("title", null);
if (is_null($title)) {
$title = "hoge fuga foobar";
}
$this->message = $title;
}
}
コントローラー等でセットされたデータ(set_globalメソッドでもsetでも設定可能。ちょっと余談の方で書いてます)をVieWModelでも扱える。で上記の
$this->_view->get("title", null)
は
$this->_view->title
でもアクセス可能だけど、fuel/core/classes/view.phpで「データが存在しない場合にはOutOfBoundsExceptionをスローする」ような仕組みになっているので、getメソッドを使う事で存在しない場合でもデフォルトの値を設定する事が出来る。そこら辺認知しておかないと後々やばそうなので(tryすれば良いだろっていう事で解決する問題ではないと思うので)
通常のViewと同様にapp/views/(View_名前のCamelCaseを階層化).phpなビューが参照されるので、今回はapp/views/sample.phpを作る
fuel/app/views/sample.php
<h2><?php echo $message; ?></h2>
後ほど書くけど、前回同様にController_Templateを使っているので
fuel/app/classes/controller/home.php
<?php
class Controller_Home extends Controller_Template {
public $template = "layout";
public function get_index() {
$this->template->set_global("title", "AAA");
$this->template->content = ViewModel::forge("sample");
}
}
ViewModel::forgeを使ってViewModelをレンダリング出来る。で第2引数でViewModelのメソッドを変えられる模様(デフォルトはviewメソッド)
余談: ViewModelのデータの扱いについて
上記で、ViewModel上で$this->view->getを使う事でコントローラー等から設定されたデータを利用する事が出来ると書いたけど、例えばテストケース等でテストする際にどうやってデータをセットするのかって所。今回はコントローラーな所がController_Tempalteなんで、set_globalを用いてデータを設定している。んじゃsetglobalを使わずにデータをセットする場合はどうなのかって所
<?php
class Controller_Home extends Controller_Template {
public $template = "layout";
public function get_index() {
$vm = ViewModel::forge("sample");
$vm->set("title", "A");
$this->template->content = $vm;
//$this->template->set_global("title", "AAA");
}
}
多分、こんな感じかと。ViewModelインスタンスのrenderメソッドを使えばレンダリング結果も取得できるので、テストする際はそんな感じでやれば良いんじゃないかという感じで、なにもコントローラーだけで実装書くという方式ではなくViewModelを使う事で実装を分離したりも出来る模様