Laravelの各要素とその接続の流れ

### はじめに

Laravelは、リクエストがエントリーポイントから始まり、ルーティングによって対応するコントローラーに処理が渡され、必要に応じてモデルを通じてデータベースからデータを取得し、最終的にビューで画面として出力される仕組みになっています。ここでは、その各要素がどこにあり、どのように設定されているかを解説します。

### 1. エントリーポイント (public/index.php)

**役割：** Laravelアプリケーションの全リクエストは、このファイルから処理が始まります。
- **ブートストラップ：** Composerのオートローダーを読み込み、bootstrap/app.phpを経由してアプリケーションを初期化します。
- **リクエスト処理：** カーネル（Illuminate\Contracts\Http\Kernel）がリクエストを受け取り、アプリケーション全体の実行フローを制御します。

**例：public/index.php**

```php
define('LARAVEL_START', microtime(true));

require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);
```

### 2. ルーティング (routes/web.php)

**役割：** HTTPリクエストのURLやメソッドに応じた処理先を定義します。
- **ルート定義：** 各ルートで、リクエストを処理するクロージャまたはコントローラーのメソッドを指定します。
- **ミドルウェア連携：** 認証やCORSなど、共通の前処理・後処理もルートごとに指定できます。

**例：routes/web.php**

```php
Route::get('/', function () {
    return view('welcome'); // welcome.blade.phpをレンダリング
});

Route::get('/users', [App\Http\Controllers\UserController::class, 'index']);
```

### 3. コントローラー (app/Http/Controllers)

**役割：** ルートから呼び出され、リクエストに応じたビジネスロジックを実行します。
- **データ取得：** 必要に応じて、モデルを使ってデータベースからデータを取得します。
- **ビューへのデータ渡し：** 処理結果をビューに渡し、ユーザーへのレスポンスを作成します。

**例：app/Http/Controllers/UserController.php**

```php
namespace App\Http\Controllers;

use App\Models\User; // モデルを利用
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        // 全ユーザー情報を取得
        $users = User::all();
        
        // users/index.blade.phpビューにデータを渡す
        return view('users.index', compact('users'));
    }
}
```

### 4. モデル (app/Models)

**役割：** データベースとのやり取り（CRUD操作）を担当するクラスです。
- **Eloquent ORM：** LaravelのEloquentを利用して、テーブルとの対応付けやリレーションシップが容易に設定できます。
- **プロパティ定義：** `$fillable`プロパティなどを使って、どのカラムが一括代入可能かなどを定義します。

**例：app/Models/User.php**

```php
namespace App\Models;

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

class User extends Model
{
    use HasFactory;

    // マスアサインメント可能な属性
    protected $fillable = ['name', 'email', 'password'];
}
```

### 5. ビュー (resources/views)

**役割：** ユーザーに表示する画面を作成するファイル群です。
- **Bladeテンプレート：** .blade.phpファイルを利用し、PHPコードとHTMLをシンプルに組み合わせて記述します。
- **レイアウトの活用：** 共通部分（ヘッダーやフッター）はレイアウトファイルとして管理し、各ビューで継承することが可能です。

#### `.blade.php` とは？
`.blade.php` は、Laravel の テンプレートエンジン「Blade（ブレード）」を使用するビューを表すファイルの拡張子です。

**Blade テンプレートの例**
```blade
@extends('layouts.app')

@section('title', 'User List')

@section('content')
    <h1>ユーザー一覧</h1>
    <ul>
        @foreach ($users as $user)
            <li>{{ $user->name }} ({{ $user->email }})</li>
        @endforeach
    </ul>
@endsection
```

### Blade テンプレートの関係

| コード                       | 役割                                                        |
|------------------------------|-------------------------------------------------------------|
| `.blade.php`                 | Laravel のテンプレートファイル                              |
| `@extends('layouts.app')`    | 親レイアウト `layouts/app.blade.php` を継承                |
| `@section('title', 'User List')` | 親ビューの `@yield('title')` に "User List" を挿入         |
| `@section('content')`        | 親ビューの `@yield('content')` にページ固有のコンテンツを挿入 |

✅ Blade を使うと、ビューを効率的に管理できる！

---

### レイアウトファイルの例: `resources/views/layouts/app.blade.php`

下記のように記述すると、各ビューから `@extends('layouts.app')` で継承し、全体の構造を共通化できます。

```blade
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>@yield('title', 'デフォルトタイトル')</title>
</head>
<body>
    <header>
        <h1>サイトのヘッダー</h1>
    </header>

    <div class="container">
        @yield('content')  {{-- ここに子ビューの内容が入る --}}
    </div>

    <footer>
        <p>サイトのフッター</p>
    </footer>
</body>
</html>
```

このように、レイアウトファイル（app.blade.php）は以下の点を担当します:
- HTMLドキュメント構造の定義
- `<head>` セクションでの `<title>` や `<meta>` タグ
- ヘッダー / フッターなど共通部分の配置
- `@yield('content')` でページ固有コンテンツの差し込み先を用意

複数ページで共通の見た目を使いたい場合、レイアウトファイルを定義し、各ページで `@extends('layouts.app')` を使うと開発効率が大幅に向上します。

### 全体の接続の流れ
1. **リクエスト受付：** ユーザーからのリクエストはpublic/index.phpでキャプチャされ、アプリケーションが初期化されます。
2. **ルーティング：** routes/web.phpで定義されたルートに従い、リクエストが適切なコントローラー（またはクロージャ）に振り分けられます。
3. **コントローラー処理：** コントローラーは、必要なビジネスロジックを実行し、モデルを利用してデータベースから情報を取得し、最終的にビューにデータを渡します。
4. **ビューの表示：** 渡されたデータを元に、Bladeテンプレートがレンダリングされ、ユーザーにHTMLレスポンスが返されます。

### まとめ

Laravelのアーキテクチャでは、
- **public/index.php** がエントリーポイントとなり、全体のブートストラップを担います。
- **routes/web.php** により、リクエストURLと処理すべきコントローラーやクロージャがマッピングされます。
- **app/Http/Controllers** 内のコントローラーが、ビジネスロジックやモデルとの連携を実行し、
- **app/Models** のモデルがデータベースと連携、そして
- **resources/views** のBladeテンプレートが最終的な表示を生成します。

これらの設定ファイルやディレクトリの役割を明確に理解することで、Laravelの開発フローを効率的に構築できるようになります。