【Laravel】MVCモデルってなんやねん

# はじめに
こんにちは、エンジニア2年目の嶋田です。
まずは、この記事を開いていただきありがとうございます！

今回は、未経験でエンジニアになり1年間Laravelを使って開発をしてきた私が、最初に理解できなかったMVCモデルについてできるだけ簡単に、わかりやすく解説をしたいと思います。

Laravel以外にもRailsをはじめとする他のフレームワークでも活かされるだけでなく、ソフトウェア開発全体においても大きな理解のステップとなるのでこの機会に是非、完璧に理解しちゃいましょう！

# 目次

- [MVCモデルとは何か？](#mvcモデルとは何か)
- [MVCモデルのコンポーネント](#mvcモデルのコンポーネント)
  - [モデル（Model）](#モデルmodel)
  - [ビュー（View）](#ビューview)
  - [コントローラー（Controller）](#コントローラーcontroller)
- [MVCモデルの動作フロー](#mvcモデルの動作フロー)
- [MVCモデルを理解しよう](#mvcモデルを理解しよう)
- [実践的なコード例](#実践的なコード例)
  - [モデル](#モデル)
  - [ビュー](#ビュー)
  - [コントローラー](#コントローラー)
- [MVCモデルの利点と注意点](#mvcモデルの利点と注意点)
- [最後に](#最後に)
- [参考文献](#参考文献)


# MVCモデルとは何か？
MVCモデル（Model-View-Controllerモデル）は、ソフトウェア開発における設計パターンの一つです。このモデルは、アプリケーションを3つの主要なコンポーネントに分割し、それぞれのコンポーネントが異なる役割を果たすことで、効率的で保守しやすな開発を支援します。

# MVCモデルのコンポーネント

## モデル（Model）
モデルは、アプリケーション内のデータとその処理を担当します。データベースとのやり取りやデータのバリデーションなどがモデルの責任です。データの整合性を保ちつつ、コントローラーやビューと連携してアプリケーション全体の動作を制御します。

## ビュー（View）
ビューは、ユーザーに表示されるインターフェースを担当します。ユーザーがデータを閲覧し、操作できるように情報を適切に整形して表示します。ビューはユーザー体験を重視し、デザインやユーザーインタラクションを担当します。

## コントローラー（Controller）
コントローラーは、モデルとビューの仲介役として動作します。ユーザーからのリクエストを受け取り、その処理を適切なモデルに依頼します。そして、必要なデータを取得してビューに渡し、最終的な表示内容を制御します。

# MVCモデルの動作フロー

<img width="100%" alt="MVCモデル" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/62b1cf15-b8b4-685b-c528-99e61669c495.png">

1. ユーザーがアプリケーションにリクエストを送信
2. リクエストはコントローラーによって受け取られる
3. コントローラーは必要なデータをモデルに要求する
4. モデルはデータベースからデータを取得する
5. モデルは情報をコントローラーに返す
6. コントローラーは取得したデータをビューに渡す
7. ビューはデータを適切に整形し、ユーザーに表示する

# MVCモデルを理解しよう

MVCモデルを理解するために、飲食店のアルバイトの役割に例えてみます。

あるレストランでのアルバイトの役割を以下のようにMVCモデルに関連付けると以下のようになります。

- **シェフ**がモデルです。キッチン(DB)から材料(データ)を取り出し調理します。

- **ウェイター**がコントローラーです。お客様(ユーザー)からの注文を受け取り、必要な情報をシェフ(モデル)に伝えます。

- **テーブル**がビューです。料理を適切な盛り付けでお客様(ユーザー)に提供します。

アルバイトの動作フローをMVCモデルの動作フローに当てはめると以下のようになります。

1. お客様(ユーザー)が注文を出す
2. ウェイター(コントローラー)が注文を受け取る
3. ウェイター(コントローラー)は必要な情報（料理の詳細、特別なリクエストなど）をシェフ(モデル)に伝える
4. シェフ(モデル)は食材やレシピの情報が格納されている場所(DB)から必要な材料(データ)を取り出す
5. シェフ(モデル)は調理が完了した料理をウェイター(コントローラー)に渡す
6. ウェイター(コントローラー)はテーブル(ビュー)に届ける
7. お客様にテーブル(ビュー)で提供される


# 実践的なコード例
以下はLaravelフレームワークを使ったシンプルなタスク管理アプリケーションのコードです。

## モデル
```php
class Task extends Model {
    protected $fillable = ['title', 'description', 'completed'];
    // 他の関数やリレーションシップの定義
}

```
## ビュー
```html
<!DOCTYPE html>
<html>
<head>
    <title>タスク管理</title>
</head>
<body>
    <h1>タスク一覧</h1>
    <ul>
        @foreach($tasks as $task)
            <li>{{ $task->title }} - @if($task->completed) 完了 @else 未完了 @endif</li>
        @endforeach
    </ul>
</body>
</html>

```
## コントローラー
```php
class TaskController extends Controller {
    public function index() {
        $tasks = Task::all();
        return view('tasks.index', compact('tasks'));
    }
    // 他のアクションや関数の定義
}
```

# MVCモデルの利点と注意点

## 利点

- **保守性と拡張性の向上**: 各コンポーネントが分離されているため、修正や変更が容易に行えます。新しい機能を追加する際にも影響範囲を限定して実装できます。

- **再利用可能なコンポーネント**: 各コンポーネントが独立しているため、ビューやモデルの再利用が可能です。同じモデルを異なるビューで使用したり、同じビューを異なるコントローラーで使用することができます。

- **協力的な開発**: 複数の開発者が同時に作業する場合でも、コンポーネント間の疎結合により、互いの作業が干渉しにくくなります。

## 注意点

- **複雑性の増加**: MVCモデルは概念的には分かりやすいですが、複雑なアプリケーションではコンポーネント間の相互作用が複雑になることがあります。適切な設計が必要です。

#最後に
記事を読んでくださりありがとうございます。
今回は私自身が最初に引っかかったMVCモデルについてまとめてみました。
少しでも理解につながったら嬉しいです。

## 参考文献
- [Laravel公式ドキュメント](https://laravel.com/docs)
- [MVC Architecture: Explained](https://www.tutorialspoint.com/mvc_framework/mvc_framework_introduction.htm)