質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

2回答

3830閲覧

MVCの使い方、使い分けについて

tampopopofu

総合スコア22

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

1グッド

0クリップ

投稿2015/05/03 05:48

編集2015/05/05 05:45

WebサイトでのMVCの使い方、使い分けについて教えてください。

メールアドレスとパスワードでの新規登録を例とさせてください。

[やりたいこと]
・入力チェック
・メールアドレスの重複チェック

この処理を行う場合、下記の案1と案2のどちらの使い方がいいか迷っています。

■案1
・コントローラからモデルを呼び出す。
・モデル内で入力チェック、重複チェックを行い、結果をコントローラに返す。
・コントローラからその結果を判定し、NGの場合エラーページに遷移する。

■案2
・コントローラからモデルの入力チェックを呼び出す。
・コントローラからモデルの重複チェックを呼び出す。
・コントローラからその都度、結果を判定し、NGの場合エラーページに遷移する。

どちらも正解はなくて好きなほうを使えばいいのか、案1、案2のどちらかのほうが
これこれこういう場合にいいとかなのか、もしくはそれ以外の方法がいいのか分かりません。

ご指導の程、よろしくお願いします。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

なるほど、そうなんですね。

「重複チェック」を「メールの送信」に置き換えても同じ考えでしょうか。

私であれば、その場合、モデルでのメール送信を行いません。
1 入力チェック
2 メール送信
という順番に、コントローラー側で呼び出します。

メール送信は、他の処理でも利用することがあると思うので、
共通化(コンポーネント化)させたいからです。

例えば、CakePHPなどでは、Componentクラスを継承して
コントローラーの共通化を行います。

それぞれに呼ぶ方法だと、俗に言う「コントローラの肥大」に
なってしまうのかと思っています。

私の場合は、コントローラが肥大化してきたときは、
共通化させる必要がなくても、整理させるために、
そのビジネスロジックだけを集めたクラスを用意することもあります。

MVCB(注意:私の適当な造語です。一般的ではありません)というような構成になると思います。
(Bは、コントローラの細かい処理を担うビジネスロジックという意味です)

投稿2015/05/05 08:51

takiuchi

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tampopopofu

2015/05/05 09:16

再び、ありがとうございます。 >私であれば、その場合、モデルでのメール送信を行いません。 >1 入力チェック >2 メール送信 >という順番に、コントローラー側で呼び出します。 ということは、案2のほうが近い感じですね。 まだまだこれから悩むかもしれませんが、今回は コントローラ ⇒ モデル.処理A コントローラ ⇒ モデル.処理B コントローラ ⇒ モデル.処理C ・・・ と、まとまった単位の処理ごとにコントローラからモデルを呼ぶ方法にします。 これでなんとか先に進むことができそうです。 分かりやすく丁寧なご回答ありがとうございました。
takiuchi

2015/05/05 10:18

>ということは、案2のほうが近い感じですね。 はい、その通りです。 結果、案2のほうが近いです。 お役に立てたようで嬉しいです。 ありがとうございました。
guest

0

こんにちは。
私は、次の3点から、「案1」が最適解だと思います。

(1)
さまざまなMVCの概念を取り入れた
フレームワーク(PHPであれば、CakePHPやFuelPHPなど)の方針では、
モデルに複数のバリデーションルールを適用するようになっている。
(巨人の肩に乗る作戦です)

(2)
・未入力チェック
・フォーマットチェック
・重複チェック
などの処理をまとめて、
・入力チェック(validate)
と抽象化することで、
インターフェース(呼び出すメソッド)を共通化できる。

(3)
モデルが検証処理を担ったほうが
テストのカバレッジ率の高いユニットテストを作成しやすい。
(細かい話で、すみません)

備考:
もちろん、おっしゃる通り、物事に正解はないので、
状況によっては、「案2」を採用するかもしれません。

例としては、ちょっと苦しいかもしれませんけど、
次のようばケースですかね。

重複チェックするためには、データベースへのアクセスが発生する。
だから、入力チェックでNGの場合は、さっさと処理を終わらせて、
データベースの負担を軽させよう。

と考えるかもしれません。

投稿2015/05/05 07:15

takiuchi

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tampopopofu

2015/05/05 07:48

ご回答ありがとうございます。 大変分かりやすく勉強になります。 申し訳ございませんが、追加でお聞きしたいことがございます。 「重複チェック」を「メールの送信」に置き換えても同じ考えでしょうか。 例題としました「新規登録」という処理の中で、 入力チェック(validate) 、メール送信 で一連の処理が完了するとします。 この場合でも、コントローラから新規登録モデルを呼び出し、そのモデル内で 入力チェック(validate) 、メール送信 を行う、ほうが最適でしょうか。 コントローラから入力チェック(validate) 、メール送信と それぞれに呼ぶ方法だと、俗に言う「コントローラの肥大」に なってしまうのかと思っています。 しかし、コントローラは主処理をせず、モデルの操作を行う、という概念からすると こちらの方法でも合っているのかなと思ってしまいます。 悩みます・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問