[Laravel]MVCまとめ

## はじめに
今まで学習したことを、自分なりにまとめていきます。

## MVCモデルとは
MVC（Model-View-Controller）モデルは、ソフトウェアアーキテクチャの一種で、特にユーザーインターフェースを持つアプリケーションの設計に利用されます。このモデルは、アプリケーションを3つの主要なコンポーネントに分割します。

<dl>
  <dt>モデル（Model):</dt>
  <dd>・アプリケーションのデータやビジネスロジックを管理します。</dd>
  <dd>・データの状態や振る舞いに関する処理が含まれます。</dd>
  <dd>・ユーザーインターフェースに依存しない形でデータを保持し、変更を通知する仕組みがあります。。</dd>
  <dt>ビュー（View）:</dt>
  <dd>・ユーザーインターフェースを表示し、ユーザーとの対話を担当します。</dd>
  <dd>・データを表示する方法やユーザーの入力を受け付ける方法を定義します。</dd>
  <dd>・モデルの変更を検知し、それに応じて表示を更新します。</dd>
  <dt>コントローラ（Controller）:</dt>
  <dd>・ユーザーからの入力を受け取り、それに基づいてモデルを更新したり、ビューを操作したりします。</dd>
  <dd>・ユーザーインターフェースとバックエンドの間で仲介的な役割を果たします。</dd>
  <dd>・ユーザーの操作に応じてモデルやビューを変更し、それらの間の連携を調整します。</dd>
</dl>

このアーキテクチャの利点の一つは、各コンポーネントが独立していることです。例えば、デザイナーがビューを変更したい場合、それがモデルやコントローラに影響を与えないようになっています。これにより、ソフトウェアの保守性や拡張性が向上します。

## モデル(Model)
主にアプリケーションのデータに対する操作を担います。
データベースへデータ登録する処理やデータ取得の処理を記述することが理想です。

https://readouble.com/laravel/10.x/ja/eloquent.html

### モデルファイルの作成
モデルファイルもマイグレーションファイルやシーダーファイルのように、下記のようなArtisanコマンドを使用して作成することができます。

```
$ ./vendor/bin/sail php artisan make:model クラス名
```
:::note info
make:modelコマンドはいくつかのオプションをサポートしており、これらのオプションを使用することでモデルの生成に関する様々な設定が可能です。

```:例:'-a'オプション
$ ./vendor/bin/sail php artisan make:model モデル名 -a
```
例えば、このオプションを使用すると、モデル、マイグレーション、ファクトリ、コントローラの基本的なファイルが一度に生成されます。これにより、CRUD（Create, Read, Update, Delete）に関連するファイルがまとめて作成されます。
:::

作成したファイルを確認してみましょう。
```php:/app/Models/クラス名.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class クラス名 extends Model
{
    use HasFactory;
}
```

作成したファイルの中のクラス名と、データベースのテーブルで名前が単数形と複数形で異なることに注意してください。
Eloquentでは、モデルのクラス名を複数形にしてアッパーキャメルケースだったものをスネークケースにしたものが、紐づけ先のテーブルとして自動的に認識されます。
※アッパーキャメルケース例：先頭の文字と単語の区切り文字を大文字している名前
※スネークケース例：アンダースコア(アンダーバー)で区切られている名前

### モデルファイルの記述

モデルファイルはほとんど中身を変更せずに使用することができますが、追加しておいた方がいいこともあります。
```php:/app/Models/クラス名.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use HasFactory;

    // テーブル名
    protected $table = 'tables';

    // 可変項目
    protected $fillable = [
        'title',
        'content',
    ];
}
```

追加したのは下記のコードです。
```php:テーブル名
protected $table = 'tables';
```
こちらのコードはモデルファイルはテーブル名の単数形であり、アッパーキャメルケースであれば、自動的にテーブルとモデルが紐付けられますが、protected $tableを使用することで任意のテーブル名を指定することもできます。
もしモデルクラス名とテーブル名が全く違う場合などはこのように記述してください。


```php:可変項目
protected $fillable = [
    'title',
    'content',
];
```
こちらのコードはコントローラーなどでデータベースに登録する際に使用するcreateメソッドを使うために記述します。
createメソッドを使用しない場合は必要ありませんが、将来的に使用するので初めに記述しておきましょう。

これでモデルファイルの作成は終わりです。

## ルート(Route)
ルートとはLaravelでルーティングを行う機能です。
ブラウザからアクセスがあった際に、ルートを使用してリクエストを目的のコントローラにルーティングすることができます。
すべてのLaravelルートは、routesディレクトリにあるルートファイルで定義されます。﻿

https://readouble.com/laravel/10.x/ja/routing.html

### web.phpについて
Laravelをインストールした際に、routes/web.phpファイルが作成されていると思います。
```php:routes/web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});
```
ファイルの内容を確認してみると、 **Route::get()** というコードが記述されています。
第一引数に「指定したいパス」、第二引数には「第一引数のパスへアクセスがあった場合に実行する処理」を記述します。
この場合、第一引数は **/** だけなので **http://<foo>localhost</foo>** が開かれたら、第二引数の **return view(‘welcome’);** を実行する、という意味になります。
ちなみに**return view('welcome')** は、 **resources/views/welcome.blade.php** を表示するという意味になります。


## コントローラー(Controller)

コントローラー(Controller)ではModelとViewの橋渡しを担います。

https://readouble.com/laravel/10.x/ja/controllers.html

### コントローラーファイルの作成

下記コマンドを使用して作成します。

```
$ ./vendor/bin/sail php artisan make:controller クラス名
```
クラス名のところにはテーブル名の単数形にControllerを連結させます。
例えば、testsテーブルのコントローラーを作成する場合のクラス名はTestControllerとなります。

```php:app/Http/Controllers/TestController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    // --- ここに各メソッドを記述 ---

    
}
```

ちなみに公式ドキュメントのリソースコントローラに載っているように、上記の各メソッドを記述のところにCRUD(作成、読み取り、更新、削除)をもう少し細かく７つに分けて自動生成することができます。
そのためには、'--resource'オプションを指定します。
```:例:'--resource'オプション
$ ./vendor/bin/sail php artisan make:controller PhotoController --resource
```

上記コマンドでコントローラーを作成した次は、コントローラーを指すルートを登録しましょう。
routes/web.phpに下記のコードを追加してください。

```php:routes/web.php
use App\Http\Controllers\PhotoController;

Route::resource('photos', PhotoController::class);
```

追加し、http://localhost/photos へアクセスすると、indexメソッドが実行されます。
indexメソッドにreturn view('bladeファイル名')とすることで、指定したresources/views配下のbladeファイルを表示することができます。

bladeファイルについては次のビュー(View)で説明します。

## ビュー(View)

モニターに表示されユーザーが見る画面がこのビュー(View)です。
resources/views/~.blade.phpがビュー(View)になります。
BladeファイルはHTMLベースで書かれています。
※HTMLについての詳しい説明は省略します。

https://readouble.com/laravel/10.x/ja/views.html

### Bladeテンプレートとは

BladeファイルはLaravelで使用されるテンプレートエンジンです
HTMLとPHPを記述することができます。﻿

https://readouble.com/laravel/10.x/ja/blade.html

### Bladeテンプレートの使い方

Bladeテンプレートには使用できる構文を表にまとめました。
これらの構文を使用することで、複数のページを作成する時の見た目(View)の管理が簡単にできるようになります。

| 構文 | 説明 | 
|:-----------|:------------|
| `@extends`('Bladeファイル')| ()内のBladeファイルを継承することができる|
| `@yield`('セクション名')| ()内のセクション名が同じ`@section`~`@endsection`までを読み込むことができる|
| `@section`('セクション名') ~ `@endsection`| `@section`と`@endsection`で囲まれた部分を`@yield`部分に追加する|
| `@include`('Bladeファイル')|()内のファイルを読み込むことができる|



## さいごに

いかがだったでしょうか。

他にもいろいろな記事を書いているのでぜひ読んでいただけたら嬉しいです。