【Laravel】MVCモデルという概念

<br>
こんにちは、Reikaです。<br>私は現在、アプレンティスの5期生として日々勉強に励んでいます。<br>

https://apprentice.jp/lp

アプレンティスの課題として**Laravelの学習**に取り組みました。<br>今回はこの経験を通じて学んだことについて、記述していきます。<br>

# 目次
1.Laravelとは？
2.MVCモデルについて

## 1.Laravelとは？
まずは **Laravelって何？** というところからです。<br>Laravelは、ウェブ開発のための **PHPフレームワーク**です。<br>簡単に言えば、ウェブサイトやウェブアプリケーションを作る際の **お道具セット** みたいなものです。

![df436fdf79614aa4fe8cdcf9c93c4b9b_t.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/56f40bb6-668e-1537-7533-37689fa96f96.jpeg)


例えば、ウェブサイトは複数のページで構成されていますよね？<br>最初にホームのページがあり、ログインするためにアドレスとパスワードを入力するページがあり、記事を作成するページがあり。<br>それぞれのページがどのURLに対応するかを決めるのが **「ルーティングシステム」（後に詳しく説明します）** です。<br>Laravelでは、URLとページを結びつける作業を簡単に行うことができます。

また、ウェブサイトでは情報を保存するためにデータベースを使います。<br>Laravelでは、データベースを操作するのがとても簡単で、例えば、ユーザーが入力した情報を保存したり、表示するための方法がわかりやすく提供されています。

つまり、Laravelを使えば、ウェブサイトやウェブアプリケーションを作るための基本的な道具が揃っています！<br>

## 2.MVCモデルについて

LaravelではMVCモデルを使って作られています。<br>MVCモデルとは、<br>
 **M「Model(モデル)」** 
 **V「View(ビュー)」** 
 **C「Controller(コントローラ)」**  　をそれぞれ意味しています。
 この３つに加えて **ルーター** を使って処理が実行されます。これを **「ルーティングシステム」** と言います。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/57139d68-fe35-3a82-b8f6-ed1434e55cc3.png)


（いらすとやさん、めちゃくちゃお世話になってます。）<br>

### Model(モデル)
モデルはデータベースとの連携を担当します。<br>データベースにデータを保存したり、データベースからデータを取得したりします。<br>Laravelでは、モデルは通常Eloquent ORMを使用して、簡単かつ直感的にデータベース操作を行います。<br>

例：todosテーブルに入ったレコードを全て取得して、ビューに表示する
```php
class TodoController extends Controller
{
    public function index()
    {
        // todosテーブルに入っているレコードを全て取得し、$todos変数に代入する
        $todos = Todo::all();

        // 取得したTODOをビューに渡して表示する
        return view('todos.index', ['todos' => $todos]);
    }
```
この例では、Todoモデルを使用してtodosテーブルの全てのレコードを取得しています。<br>取得したデータは$todos変数に格納され、その後ビューに渡されます。<br>ビューでは、このデータを使ってTODOリストを表示します。

### View（ビュー）
ビューはユーザーが直接目にする部分で、ブラウザに表示される内容を担当します。<br>Laravelでは、ビューを **Bladeというテンプレートエンジン** を使って作成します。<br>そのため、ビューのファイル拡張子はすべて .blade.php となります。<br>テンプレートエンジンとは、通常のHTMLコードに 変数や制御構文 を埋め込むことができるものです。

例：TODOリストを表示するBladeテンプレート
```php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="{{ asset('css/todos.css') }}">
    <title>ToDo一覧</title>
</head>
<body>
<div class="container">
    <h1>Todo List</h1>

    <a class="new-task" href="/todos/new">タスクを追加する</a>

    <table>
        <thead>
            <tr>
                <th>タスク</th>
                <th>アクション</th>
            </tr>
        </thead>
        <tbody>
        @foreach($todos as $todo)
            <tr>
                <td>{{ $todo->title }}</td>
                <td>
                    <a class="edit" href="{{ route('todos.edit', $todo->id) }}">編集</a>
                    <a class="delete" href="#" onclick="return confirmDelete('{{ $todo->id }}')">削除</a>
                    <form id="delete-form-{{ $todo->id }}" action="{{ route('todos.destroy', $todo->id) }}" method="POST" style="display: none;">
                        @csrf
                        @method('DELETE')
                    </form>
                </td>
            </tr>
        @endforeach
        </tbody>
    </table>
</div>
<script>
    function confirmDelete(id) {
        if (confirm('本当に削除しますか？')) {
            document.getElementById('delete-form-' + id).submit();
        }
        return false;
    }
</script>
</body>
</html>

```

### Controller(コントローラー)
コントローラーは、ルーターから受け取ったユーザーのリクエストを実際の処理に変換する役割を担います。<br>具体的には、モデルを介してデータベースとやり取りしたり、設定ファイルを読み込んだり、さまざまなコンポーネントと連携します。<br>最終的に、ユーザーのリクエストに応じた適切なレスポンスを返します。<br>

例：新しいTODOタスクを作成するためのフォームを表示する

```php
public function create()
    {
    return view('todos.create');
    }
```

この例では、create メソッドが todos.create ビューを返しています。<br>つまり、このメソッドは新しいTODOタスクを作成するためのフォームを含むビューを表示します。<br>

### ルーター
最後に、ルーターは、ユーザーのリクエストをどのコントローラーのどのメソッドで処理するかを割り振る役割を担います。<br>具体的には、HTTPリクエスト（GET、POSTなど）とURLパターンを指定し、それに応じて適切なコントローラーメソッドを呼び出します。<br>
ルート設定の書き方：
```php
Route::HTTPメソッド('URL', [コントローラー::class, 'メソッド'])->name('ルート名');
```

例：新しいTODOタスクを作成するフォームを表示するためのルート
```php
Route::get('/todos/create', [TodoController::class, 'create'])->name('todos.create');

```
* Route::get は、GETリクエストに対するルートを定義します。
* '/todos/create' は、ユーザーがアクセスするURLパスです。
* [TodoController::class, 'create'] は、このリクエストを処理するコントローラーとメソッドを指定しています。この場合、TodoController の create メソッドが呼び出されます。
* ->name('todos.create') は、このルートに名前を付けています。この名前は、ルートを参照するときに便利です。

# まとめ
いかがでしたでしょうか？<br>Laravelは自転車に乗れるようになった人（PHPやMySQLに慣れた人）が電動自転車(Laravel)に乗れるようになるくらい、作業を効率化し、便利なものだと感じました。<br>最初は学ぶことが多いと感じるかもしれませんが、その奥深さゆえに学び甲斐があります。<br>私も日々新しい発見をしながら学習を進めています。<br>

最後まで読んでいただき、ありがとうございました！