Webアプリやシステム開発を学ぶとよく出てくる「MVCモデル」。
これは、アプリの構造を整理してわかりやすくするための設計パターンです。
Laravel、CakePHP、CodeIgniter、Ruby on Rails、Djangoなど、ほとんどのWebフレームワークがこの考え方をベースにしています。
また、フロントエンドでも同じような考え方が使われており、たとえば JavaScript では「model.js(データ処理)」「view.js(画面表示)」「controller.js(操作やイベント制御)」のように、役割を分けて整理する構成をとることがあります。
React や Vue.js などのフレームワークも、この MVC モデルの思想をもとに進化した仕組みです。
基本の設計パターン MVCモデルとは?
MVCとは、以下の3つの単語の頭文字です。
| 略称 | 名称 | 役割 |
|---|---|---|
| M | Model(モデル) | データやビジネスロジックを扱う部分 |
| V | View(ビュー) | 画面表示や見た目を担当する部分 |
| C | Controller(コントローラ) | ユーザーの操作を受け取り、ModelとViewをつなぐ部分 |
この3つに分けることで、処理と見た目を分離し、コードが整理されます。
MVCの流れを図で見てみよう

[ユーザーの操作]
↓
Controller(制御)
↓
Model(データ取得・計算など)
↓
Controller(結果を受け取る)
↓
View(HTML表示)
つまり、Controllerが司令塔のような役割を果たし、Modelがデータを処理し、Viewが結果を画面に出す、という流れです。
PHPで考えてみると
たとえば、次のようなフォルダ構成で簡単なMVCモデルを作ることができます。
/mvc/ ├─ index.php ← Controller(入り口) ├─ model.php ← Model(データ処理) └─ view.php ← View(表示)
model.php
<?php
function getMessage() {
return "こんにちは、MVCモデルの世界へ!";
}
index.php(Controller)
<?php require 'model.php'; // モデルを呼び出し $message = getMessage(); require 'view.php'; // ビューへデータを渡す
view.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>MVCの例</title> </head> <body> <h1><?php echo htmlspecialchars($message); ?></h1> </body> </html>
MVCモデルのメリット
| メリット | 内容 |
|---|---|
| 分業しやすい | デザイナーはView、開発者はModelやControllerを担当 |
| 修正に強い | 見た目を変えてもロジックに影響しない |
| 再利用しやすい | 同じModelを他のページでも使える |
PHPでMVCモデルを考えてみよう!のトレーニングは下記です。

MVCは「整理のための考え方」です
MVCは「難しい仕組み」ではなく、整理のルールです。
PHPでのシステム開発はもちろん、JavaScriptフレームワーク(Vue、Reactなど)にも応用されています。
まずは「データ(Model)」「表示(View)」「つなぐ(Controller)」を分けて考えることから始めてみましょう。
MVCモデル以外の設計パターン
ここまで見てきた「MVCモデル」は、Webアプリ開発の基本中の基本です。
しかし、近年のアプリ開発ではフロントエンドの技術が進化し、MVVM や MVP、Flux などの設計パターンも登場しています。それぞれがMVCをベースに発展した考え方です。
MVVMモデル(Model–View–ViewModel)
MVVMは、MVCの発展型です。「Controller」の代わりに「ViewModel」を置き、View(見た目)とModel(データ)の間を自動でつなぐのが特徴です。ViewとViewModelが双方向に同期しているため、入力や操作が即座に画面に反映されます。

v-model により、入力値と画面表示が自動で同期しています。これがまさに MVVM の「双方向データバインディング」です。
例:Vue.js のコード
<div id="app">
<input v-model="message">
<p>{{ message }}</p>
</div>
<script>
const app = Vue.createApp({
data() {
return {
message: 'こんにちはMVVM'
}
}
})
app.mount('#app')
</script>
Vue.js と MVVMモデルの関係
Vue.js の公式ドキュメントでも明言されていますが、Vue は「MVVM パターンにインスパイアされたフレームワーク」です。
ただし「完全にMVVMを厳密に実装している」というよりも、MVVMの考え方をベースに、Web向けに最適化した実装になっています。
MVVMの構造とVue.jsの対応関係
| MVVMの構成要素 | Vue.jsでの対応部分 | 役割 |
|---|---|---|
| Model | data()・computed・store(Vuex)など | アプリケーションの状態やデータを保持 |
| ViewModel | Vueインスタンス(new Vue() / createApp()) | データと画面をつなぐ(リアクティブシステム) |
| View | テンプレート(<template>やDOM) | 実際に表示されるUI部分 |
Vue.jsがMVVM的である理由
v-modelによる 双方向データバインディング{{ message }}のような リアクティブ表示- データを更新すると自動でViewが更新される仕組み
つまり、開発者はControllerを書かなくても、データとUIが自動的に同期します。これがまさに「MVVMの考え方」です。
MVPモデル(Model–View–Presenter)

MVPは、MVCの「Controller」を「Presenter」に置き換えた構造です。
主にスマホアプリやGUIアプリで使われます。
- Presenter:ユーザー操作を処理し、Modelからデータを受け取ってViewへ渡す
- View:表示に専念(HTMLやUI部品のみ)
ViewとPresenterがしっかり分かれているため、テストや保守がしやすい構造です。
PHPで、MVCモデルを構成するトレーニングは下記です。

Flux / Redux(一方向データフロー)
Fluxは、React.jsなどのSPA(シングルページアプリ)で使われる設計思想です。
MVVMのように双方向ではなく、一方向にデータが流れるのが特徴です。
- アプリの状態(state)を一元管理
- データの流れが明確で、バグが少ない
- React公式の状態管理ライブラリ「Redux」もFluxをベースにしています
クリーンアーキテクチャ(Clean Architecture)
Webやモバイルの大規模開発で使われる設計思想です。
中心にあるのは「ビジネスロジック(アプリの本質)」で、
外側にあるフレームワークやDBに依存しないように設計します。
- どの技術を使っても中核のロジックが壊れない
- 長期運用や大規模開発に強い構造
LaravelなどのPHPフレームワークでは「Service層」「Repository層」として使われています。
各モデルの比較表
| モデル | 主な用途 | データの流れ | 特徴 |
|---|---|---|---|
| MVC | Webアプリ全般 | 双方向(Controller経由) | 最も基本的な構造 |
| MVVM | フロントエンド | 双方向(自動同期) | データバインディングで楽にUI更新 |
| MVP | スマホ・デスクトップ | 双方向(Presenter経由) | テスト・保守性が高い |
| Flux / Redux | React系SPA | 一方向 | 状態管理が明確で堅牢 |
| Clean Architecture | 大規模開発 | 層構造 | フレームワークに依存しない設計 |
どのモデルも「MVCを発展させた考え方」です。
大切なのは「見た目(View)と処理(Model)を分ける」という基本です。

