【PHP初心者】Laravel入門：5分で理解するMVCアーキテクチャとTodoアプリ開発

この記事で分かること：
- LaravelのMVCアーキテクチャの基本概念
- 実際のTodoアプリ開発を通じたLaravel実践
- データベース操作とEloquent ORMの使い方

**想定読者**: PHP初心者・Laravel初学者
**所要時間**: 5分で読める

## 背景・きっかけ

PHP基礎知識を習得した後、実際のWebアプリケーション開発に挑戦しました。「理論だけでなく、実際に動くものを作りたい」という思いから、LaravelでTodoアプリを開発することにしました。

## 学んだこと

### 1. LaravelのMVCアーキテクチャ理解

#### Model（モデル）- データ管理の要
```php
<?php
// app/Models/Task.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    protected $fillable = [
        'title',
        'description', 
        'completed',
        'priority',
        'due_date'
    ];
    
    protected $casts = [
        'completed' => 'boolean',
        'due_date' => 'datetime',
    ];

    public function isCompleted()
    {
        return $this->completed;
    }

    public function isOverdue()
    {
        if (!$this->due_date) {
            return false;
        }
        return $this->due_date->isPast() && !$this->completed;
    }
}
```

**学んだポイント**:
- `$fillable`でマスアサインメント対策
- `$casts`でデータ型の自動変換
- カスタムメソッドでビジネスロジックの実装

#### Controller（コントローラー）- リクエスト処理の中心
```php
<?php
// app/Http/Controllers/TaskController.php
namespace App\Http\Controllers;

use App\Models\Task;
use Illuminate\Http\Request;

class TaskController extends Controller
{
    public function index()
    {
        $tasks = Task::all();
        $data = [
            'title' => 'タスク一覧',
            'tasks' => $tasks
        ];
        return view('tasks.index', $data);
    }

    public function store(Request $request)
    {
        Task::create([
            'title' => $request->title,
            'description' => $request->description,
            'priority' => $request->priority ?? 'medium',
            'due_date' => $request->due_date,
        ]);

        return redirect()->route('tasks.index')
                        ->with('success', 'タスクが作成されました！');
    }
}
```

**学んだポイント**:
- RESTfulなリソースコントローラーの実装
- リクエストデータの取得と処理
- リダイレクトとフラッシュメッセージ

#### View（ビュー）- ユーザーインターフェース
Bladeテンプレートエンジンを使用してHTMLを動的生成

### 2. データベース設計とマイグレーション

```php
<?php
// database/migrations/create_tasks_table.php
Schema::create('tasks', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('description');
    $table->boolean('completed')->default(false);
    $table->string('priority')->default('medium');
    $table->date('due_date')->nullable();
    $table->timestamps();
});
```

**学んだポイント**:
- マイグレーションによるデータベーススキーマ管理
- 適切なデータ型の選択
- デフォルト値とnull許可の設定

### 3. ルーティングとRESTful設計

```php
<?php
// routes/web.php
use App\Http\Controllers\TaskController;

// PHP基礎知識を活用したルート
Route::get('/profile', function () {
    $profile = [
        'name' => 'shion',
        'age' => 27,
        'skills' => ['PHP', 'Laravel', '配列操作', '関数設計']
    ];
    
    $html = '<h1>プロフィール</h1>';
    foreach ($profile['skills'] as $skill) {
        $html .= '<li>' . $skill . '</li>';
    }
    return $html;
});

// RESTfulリソースルート
Route::resource('tasks', TaskController::class);
```

**学んだポイント**:
- PHP基礎知識の活用
- RESTfulなリソースルーティング
- 名前付きルートの活用

## 実装したTodoアプリの機能

### ✅ 完成した機能
- **タスク一覧表示** (`GET /tasks`)
- **タスク作成** (`POST /tasks`)
- **タスク詳細表示** (`GET /tasks/{id}`)
- **タスク編集** (`PUT /tasks/{id}`)
- **タスク削除** (`DELETE /tasks/{id}`)

### 🎯 技術的な工夫
- **優先度設定**: high/medium/lowの3段階
- **期限管理**: 期限切れタスクの自動判定
- **完了状態管理**: boolean型での状態管理
- **フラッシュメッセージ**: ユーザーフィードバック

## つまずいたポイントと解決方法

### 問題1: Eloquent ORMの理解
**課題**: データベース操作の書き方が分からない
**解決**: 公式ドキュメントを読み、`$fillable`の重要性を理解

### 問題2: Bladeテンプレートの構文
**課題**: PHPとBladeの記法の違いに混乱
**解決**: `{{ }}` と `{!! !!}` の使い分けを実践で習得

### 問題3: ルーティングの設計
**課題**: RESTfulな設計の理解不足
**解決**: `Route::resource()`の便利さを実感

## まとめ

この記事で習得したスキル：
- **MVCアーキテクチャの実践的理解**
- **Eloquent ORMによるデータベース操作**
- **RESTfulなWebアプリケーション設計**

**次のステップ**:
- 認証機能の実装
- バリデーション機能の追加
- フロントエンドの改善

## おわりに

Laravel学習を通じて、実際に動くWebアプリケーションを作ることができました！PHP基礎知識がLaravelでの開発にそのまま活かせることを実感できました。

継続的な学習で、より実践的なスキルを身につけていきます！

**学習継続のコツ**: 毎日少しずつでも手を動かすこと 💪

## 参考資料

- [Laravel公式ドキュメント](https://laravel.com/docs)
- [Laravel Bootcamp](https://bootcamp.laravel.com)
- [Eloquent ORM](https://laravel.com/docs/eloquent)