2016/04/11FuelPHPはMVC(Model、View、Controller)フレームワークとして知られていますが、『ビューモデル(ViewModel)』というオプションが存在します。その名の通り、ViewとModelの中間の担うクラスなのですが、今回はその利用方法を勉強したいと思います。MVCで構築する場合、任意のテーブルの情報を取得し画面に一覧として表示する処理を考えます。Controller内でModelからデータを取り出し、HTMLコードで整形し、Viewに渡して表示させます。それに対して以下のような意見が出ることがあるでしょう。一方で、ModelのデータをViewに渡して、View内でループさせたり値のフォーマットを調整したりしてHTMLを整形させます。すると以下のような意見もあります。「View内では表示処理のみで、あれこれロジックを組むべきではない」はたまたこんな事言う人も。「Modelはそれ自身の役割があるからController内(またはView内)で呼び出すべきじゃない」。決めの問題で、どっちでもいい気がします。そんな時、そんな処理はViewModelに記述しましょう!ViewModelクラスを用意するまずViewModelクラスを用意します。基本的にビューファイル1つにつき、1クラス用意するほうがよいでしょう。ホームページのビューファイル「/app/views/welcome/index.php」にViewModelクラスを適用する場合、「/app/classes/view/welcome/index.php」を用意します。"サンプルタイトル";}}クラス名はFuelPHPの命名ルールに従い、クラス「ViewModel」を継承します。関数は基本的に「view()」のみ設置します(例外、拡張あり)。ビューに渡す値はthisに格納します。Controllerを準備する次にコントローラ内で、アクション毎にビューモデルを使用することを宣言します。通常、コントロール「/app/classes/controller/welcome.php」内でビューに値を渡す場合は以下のように記述します。View::forge('welcome/index');}}これを先ほど用意したビューモデルを使用する場合は以下のように記述します。ViewModel::forge('welcome/index');既存の処理も簡単に切り替えられますね。これで一通りViewModelの適用は完了です。ビューファイル「/app/views/welcome/index.php」に以下のように記述すれば、「サンプルタイトル」が表示されます。$title;ちなみにテンプレートを使用する場合にも、以下のように簡単に適用できます。ViewModel::forge('welcome/index');}}まとめViewModelはうまく活用できるかどうか?ViewModelオプションは、複雑な処理が多い画面については有効だと思います。「コントローラクラスが処理で膨大になる」「ビューファイルがPHPソースでごちゃごちゃでHTMLを読み取ることができない」そういった事を防ぐために、ViewModelに処理をうまくまとめれば、コードもスッキリするでしょう。一方で、ほとんどロジックのないシンプルなページだと、クラスファイルが増えるだけなので、無理に適用する必要はないです。ページ毎に気軽に導入できるオプションなので、適材適所で判断すればよいと思います。PresenterクラスというのがあるViewModelは将来的に、同等の機能であるPresenterクラスに集約されるようです。Presenterクラスは1.7.2から利用でき、本格的なリリースは1.8からのようです。今回、Presenterでよかったのではないかというお話ですが、1.7.xではうまく動作しなかったりと不具合の元になるようです。1.7.xではViewModel、1.8.xではPresenterを利用するほうがいいかもしれません。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。inc.Profileサイト「helog」は私がWeb制作に携わるなかでの経験を中心に記しています。前にも発生したんだよなぁ。」といった無駄な時間を省くことを目的に書き始めました。「へ」の「ログ」です。個人的な技術メモのようなものですが、みなさんの何か役に立つことがあればこの上ないです。