WEBアプリのMVCについての質問

このQ&Aのポイント
  • WEBアプリのMVCについて質問です。一般的なフレームワークを用いたMVCについて質問です。
  • モデルとコントローラーの役割について気になります。特に、データの加工処理はどこで行うべきでしょうか?
  • ループ処理についても検討したいです。ビューでのループ処理は作業しにくいものですが、MVCとしてはどうなのでしょうか?
回答を見る
  • ベストアンサー

WEBアプリのMVCについて質問です。

一般的なフレームワークを用いたMVCについて質問です。 例えばM、これはモデルですね。 普通DBヘの接続はモデルでおこないクエリの発行もモデルで行いますね。 その後、クエリ実行後の結果をコントローラー側に返すと思います。 このとき、普段わたしはモデル上ではDB空の目的のデータをいっさい処理せずそのまま コントローラに返します。 返り値として、何かしらの一覧データを取得するものとします。例えば [ {name : "タロウ" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23}, {name : "花子" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23}, {name : "邦夫" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23} ] といった感じで特定の組み合わせのハッシュを多次元配列(リスト)的にラップしたものがかえりますよね。 そして、上記データをコントーラー側が受け取り、さぁいざビューへと受け渡す際に、どの程度コントローラでデータの 加工を行うものかが気になっています。 たとえば上記データでは「県市町」のデータがユニークなIDとして保持しています。このままでは「タロウ」が どの住所なのかがわかりません。どこかで「県市町」のデータリストを受け取りループで一致する住所を取得する 必要があります。 それをコントローラあるいはビュー・・・・どちらで行うのがMVCとして正しいのでしょうか?多少のループなら ビュー側で行うのもありかとおもいますが、はやりビューがループであふれかえるのは作業しにくいですよね。 MVCの基本だとは思いますが、rubyやPHPなど、フレームワークごとの細かい思想はあるでしょうが 一般的なMVCとしてみるとどうでしょうか? ちなみに、モデル内でjoin などつかって県市町のテーブルをくっつけるのはここでは考えないものとしてください。 個人的にはビュー内では大きなループ一度ですませたいものですが ・・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.4

No1です。 >コントローラは完全に、モデルで取得したデータをビューへ橋渡しするためだけに存在するというような意味合いってことでしょうか? 補足へ回答しようとしたら、すでにNo2の方が書いてましたね。 ユーザーのGUI操作に伴って、適宜モデルやビューを呼び出すのがコントローラーです。 ビューから直接モデルを参照した方が良ければすればよい。 あまり、「MVCモデル」にこだわらず、それぞれのフレームワークの枠組みに従って開発すれば良いと思いますよ。フレームワークのルールで開発するとおそらく一番効率がいいわけなので。 Railsだと、Model+View+Controlでなく、Database+Template+Processingと思えば良いのかな。

その他の回答 (3)

  • iioi
  • ベストアンサー率26% (22/84)
回答No.3

FuelPHPでは質問者の書いているような処理はMVCだけではなくてViewModelがありそこでこのような実装をすることができるようになっている。

回答No.2

>>MVCモデルの場合は、ビジネスロジックはModelの中に実装します。 >とありますが、 >コントローラは完全に、モデルで取得したデータをビューへ橋渡しするためだけに >存在するというような意味合いってことでしょうか? コントローラは入力をモデルに引き継ぐのが役割です。 Webであれば,ページ遷移まわりはコントローラの役割になります。 ページ遷移に伴って,入力がくっついて来ます。 ビューの更新は,本来的にはビュー自身の役割です。 ビューがモデルの変更を検知して (e.g. Observer Pattern),更新します。 さらに,ビューはモデルを直接参照します。 ただし,Web MVCではこの更新の仕組みを使うことは無いでしょう。 そもそもモデルの変更,ということがありえない世界なので。 それもあって,コントローラーなりMVCのフレームワークなりが,ビューへ描画要求を出すことになります。 # 大元のMVCは状態を持つ環境で生まれています。HTTPのように状態を持たない環境でMVCをやろうとすると,どこかに歪みが出てきます。 MOVEは望まれなかった子 - the sea of fertility http://ugaya40.net/architecture/dis_mov.html にもあるのですが,元々MVCはPDSによる責務の分離が根本の思想です。 表示に関わることであればP側,つまりVまたはCで処理し,そうでないならばD側,つまりMで処理します。 ちなみに,CにPLを持たせた場合,MVCとは別の名前が付いています。 # MVP (Model - View - Presenter)

1000vicki
質問者

お礼

ご回答ありがとうございます。 > 大元のMVCは状態を持つ環境で生まれています。HTTPのように状態を持たない環境でMVCをやろうとすると,どこかに歪みが出てきます。 なるほど、WEBアプリにおける MVCそのものが後発だったため、本来のMVCとはことなるのですね。 WEBアプリで正しいMVCで設計しようとしても、 もともと無理があるということなのですね。

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

Ruby on Rails のようにMVCモデルでないにもかかわらず、Model View Controlという用語を使っているフレームワークがあるため、混乱している人がいるようです。 MVCモデルの場合は、ビジネスロジックはModelの中に実装します。あなたの考えはMVCモデルから外れています。 もちろん、別にMVCモデルに従って設計しなければならないわけではないので、自分の好きなように設計すれば良いかと思いますよ。

1000vicki
質問者

補足

ご回答ありがとうございます。 >MVCモデルの場合は、ビジネスロジックはModelの中に実装します。 とありますが、 コントローラは完全に、モデルで取得したデータをビューへ橋渡しするためだけに 存在するというような意味合いってことでしょうか?

関連するQ&A

  • MVCフレームワークでMとCを分けるメリットは?

    プログラミング初心者で御座います。 現在、MVCフレームワークを使って開発をしようと考えており、 PerlのCatalystというフレームワークをちょこっと勉強しました。 そこで1点わからないことが出てきたのですが MVCフレームワークでM(Model)とC(Controller)を分けるメリットは 何でしょうか? 拙い知識では、処理の流れとして (1)C(Controller)がM(Model)を利用してデータをやり取りし、 (2)最後にV(View)に投げる というものになると思います。 V(View)は(1)が完全に終わってから「後はヨロシク」という感じで 丸投げできるので、分ける意味は分かります。 ところが、C(Controller)とM(Model)は行ったり来たりの やり取りをする必要があるので 複数のファイルに分けると逆に非効率になると思います。 なぜ敢えてCとMを分けているのか教えてください。

  • MVCについて

    開発初心者です。 MVCモデリングについて勉強しています。 Model、View、Controllerの各コンポーネント間の依存性を少なくすることができるとあるのですが、 なぜ、コンポーネント間において依存性が無いほうがいいのか、調べたところでは例が無かったので、いまいちピンと来ません。 コンポーネント間の依存性がある場合のデメリット、どういった影響があるのかを、よろしければご教授願えないでしょうか。 よろしくお願いいたします。

  • MVC構造で、各コントローラで共通な動的ページを表示するにはajaxが一般的なのでしょうか?

    MVC構造に不慣れなものです。(zendフレームワークを利用しています) コントローラAContololler.phpで、ビューA.htmlを表示しています。 ビューA.htmlの中では、共通のビューhead.htmlを最初に読み込んでいます。 コントローラB,Cでも同様にビューB,Cを表示し、共通のビューhead.htmlを最初に読み込んでいます。 このビューhead.htmlの中身を条件ごとに動的表示したいのです。 1個のコントローラ限定であれば、 コントローラ内で条件分けして結果をビューに渡してしまうだけなんですが、 複数のコントローラで呼ばれることを考えると、 それぞれのコントローラ内に同じ処理を書かなければなりません。 これを忘れてたまたまhead.htmlを読み込んでしまった時にエラーとなってしまいます。 ようするに、head.htmlを読み込む上で、コントローラ側に設定が必要という二手間かかる部分が腑に落ちません。 MVC構造でないのであれば、動的部分をhead.phpとして作っておき、 必要なページでそれを読み込むだけでいいのにって思ってしまいました。 この二手間かかるのを回避するには、 head.htmlの中で、動的データを取りにいくというajax化するしかないのでしょうか? それともhead.htmlの中にphpのコード、ここでいえばDBに繋ぐ部分や条件分けなどまで書いてしまうのもありなんですか? でもMVCの考え方としてビューの中に処理をだらだら書くのはちょっと筋違いかなぁと思うのですがどうなんでしょう。。。

    • ベストアンサー
    • PHP
  • MVC構成 コントローラに指定すべき内容

    MVC構成でビューは主にHTML, モデルではバリデーションなどをプログラミングするかと思います。 コントローラではレイアウトの指定など以外にどのような内容を指定するのが適切でしょうか?

    • ベストアンサー
    • PHP
  • 【ASP.NET MVC】フォームヘルパーの是非

    いつも大変にお世話になっています。 今回も例によってASP.NET MVCの質問です。 ASP.NET MVCでは、Htmlヘルパーを使用してビューを記述するのが常識かと思います。 例) @Html.Textbox("name", Model.name) 今回、デザイナが加わる仕事で、完成後にデザイナ側でフォーム訂正が必要になることが予想されます。 またその際、デザイナから「できるだけ独自仕様(Lazorのこと?)のテンプレートを使用しないように」とのお達しがあったため、苦慮しております。 質問です。 Htmlフォームヘルパーを使わずに、純粋なHTML記述を行った場合、どのような支障が考えられますか? 要件: @Html.Textbox("name", Model.name) と書かずに。 <input type="text" id="name" name="name" /> と(HTML展開後の文法で)書く場合の違いを知りたい です。同じ動作をするのでしょうか?また、違いの程度は? です。なにとぞよろしくお願いします。

  • 【ASP.NET MVC】モデルの作り方

    ASP.NET MVCでのモデルについて、皆様はどのように作成しておられますか? ASP.NET MVCで何本かWebシステムを構築して、いまだに試行錯誤です。 サンプル例を見ても、実際とはかけ離れた簡単な内容で、あまり参考になりません。 自分が見たいくつかのサイトではこのように書いてありました。 ドメインモデル データベースと1:1で存在する入出力用のモデル。EntityFrameworkで定義する。 拡張ドメインモデル ドメインモデルにプロパティを追加したり、複数のモデルを使いやすくまとめたモデル。 ビューモデル 画面表示するためのモデル。 フォームモデル フォーム入力値を受信するためのモデル。 理屈はわかるのですが、このように4種類もモデルを定義するものなのでしょうか? モデル間のデータのやりとりも大変ですし、定義だけで作業量が半端ない感じです。 継承などをうまく使って省力化する方法とかありますか? 皆さまの方法論をお聞きしたくお願い申し上げます。 ASP.NET MVCに限らず、CakePHPなどの例でも歓迎です。

  • RailsのMVCモデルに関しての基本的な質問

    お世話になります、Railsに関して一通り入門書を読んだのですが、MVCモデルに関してご教示頂きたいのですが、現状LinusサーバにRubyGemがインストールされているので、WEBのトップページにも活用しようと考えているのですが、基本的な質問で恐縮なのですが、そもそも、MVCモデルは外部からのイベント(通常はユーザ入力)を受け取り、モデルとやり取りし、適切なビューをユーザに表示するというのが基本的な動作かと思いますが、その外部からのイベントがない静的なWEBページを作成する場合は、特にコントローラを作成する必要はないと考えて良いのでしょうか。 現状、spinelzと部分テンプレートのWEBページ作成を検討しています。データベース等はもちろん使用しません。

  • ASP.net MVC4のデータ更新について

    お世話になっております。 MVC4でWEBプログラミング作成しながら勉強しています。 チュートリアル等で簡単なデータベースの更新は出来るようになりました。 各データ操作で1レコード1ページで作る方法はなんとなく分かりました。 例えば、Viewでデータの一覧を表示し、表示分の複数データを一括でControllerに 送る方法がまったくわかりません。 ネットで結構調べましたがなかなか分からなくて。。 List等でControllerに送る事が出来たら一括で更新できるかなと思っていますが。。 基本的な事でしょうがご教授お願いします。

  • 【ASP.NET MVC】一覧編集画面

    いつもお世話になります。 ASP.NET MVCを使って構築中のサイトで、また暗礁に乗り上げております。 商品一覧の画面で、一覧表示のままCRUD(追加・更新・削除)するインターフェースを客先から求められております。 一覧表示 → 個別画面でのCRUDはできていますが、画面遷移が面倒ということで却下されました。 ASP.NETでいう、GridViewのようなテイストです。 (各行にテキストボックス・更新ボタン・削除ボタン) モデルはこんな感じです(簡略化してあります。実際にはご教示いただいたカスタム検証もあります) public class Lady {  public int ID { get; set; }  public string name { get; set; }  public int areaID { get; set; }  public int salesAmount { get; set; } } public List<Lady> ladies; 一覧表部分のビューはこんな感じです(細かい点は省略です) @foreach (var lady in Model.ladies){  @using(Html.BeginForm("UpdateLady","Admin")) {   @Html.Hidden("ID", lady.ID)   @Html.TextBox("name", lady.name)   @Html.DropDownList("areaID", new SelectList(model.areas, "areaID","areaName", lady.areaID))   @Html.TextBox("salesAmount",lady.salesAmount)   <!-- 以降不明 -->   <input type="submit" value="更新"/>   <input type="submit" value="削除"/>  } } コントローラ class AdminController {  public EditLady(){   var model = new EditLadyView();   return View("EditLady", model);  }  [HttpPost]  public UpdateLady(Lady lady){   if (ModelState.IsValid){    // 更新    // lady.IDをキーにしてDBを更新   } else {    // 再表示 <!-- ここがわからない -->   }  }  [HttpPost]  public DeleteLady(int ID){   // 削除   // IDをキーにしてDBを削除  } } 質問点は以下の通りです。 ■表示はOKですが、できたhtmlを見ると、各行の項目が同じid / name名になります。これで正しいですか? ■同じForm内に更新ボタンが複数あった場合、formのPOST先を変える必要がありますが、javascriptを使うのでしょうか? ■検証失敗時、全体を再表示するにはどういった方法があるでしょうか? 読み直すと入力した値が消えてしまいます。 会社にMVCの経験者がおらず、苦労しています。 なにとぞお助けください。

  • 【ASP.NET MVC】HTMLヘルパーについて

    ASP.NET MVCで開発しています。 型付けHTMLヘルパーが上手く理解(というか納得?)できないので どうかご教授願います。 ところで、事前にこちらのページを覗いております。 http://www.atmarkit.co.jp/fdotnet/scottgublog/20100113stronghelper/stronghelper.html さて、本題。 <%= Html.TextBoxFor(model => model.ProductName) %> というのが、 <input type="text" id="ProductName" name="ProductName" value="*model.ProductNameの値*"/> となるのは何となく理解ができます。 理解できるということの根拠として、id(およびname)の「ProductName」はまさに 記述されていますし、ラムダ式はmodel.ProductNameを返すようになっているから、 「.NETはnameとidとvalueを取得できるんだろうよ」、と予想できるからです。 旧来のHtmlヘルパー <%= Html.Textbox("ProductName",Model.ProductName) %> に比べて、 「name(id)属性用のパラメータが必要無い」 「テンプレート内でのコードインテリセンスが効く」 という利点があるそうですが、どうしてもここで納得出来ないことがあります。 この2点の利点を実現するのに、なぜラムダ式で実現できるのでしょうか? あるいは、なぜラムダ式が採用されたのでしょうか? 別の言い方をすれば、別にラムダ式を用いなくても、.NETが賢くなれば、 <%= Html.Textbox(Model.ProductName) %> という記述で、インテリセンスが効いてコンパイルチェックも実行されても おかしく無いと思うのですが・・・。 Modelオブジェクトの型宣言はテンプレートの先頭で行われているはずですから、 「Model.」と打ったところでModelのクラスと関連付いてもおかしく無いですよね? 別にMSの仕様に文句をつけるつもりはないのですが、 「先述の2点の利点を実現する」ことと、「ラムダ式の記述」というのがどうも一致しません。 開発作業には支障ないのですが、腑に落ちなくて困っています。 ソースコードを読んでも、自分の疑問の解決には至りませんでした。 どうぞよろしくお願い致します。

専門家に質問してみよう