PHP備忘録：Laravelでメッセージ投稿フォームを作ったら、ちゃんとDBに入って感動した

## はじめに

Laravel を使った Web アプリケーション開発において、フォームからの入力を受け取り、バリデーションを通したうえでデータベースに保存するという処理は基本かつ重要な流れです。

今回は、PHP の学習をしている初学者として、実際にフォームを作成し、メッセージを MySQL に保存できたので、その手順を備忘録としてまとめます。

## 書こうと思ったきっかけ

個人的に PHP のキャッチアップをしたくて Laravel を触り始めました。フォーム入力 → バリデーション → DB保存という基本の流れを自分で手を動かして理解し、記録として残しておきたいと思ったのがきっかけです。

**実際のキャッチアップ画面**

![Screenshot 2025-05-10 at 12.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f90423b4-1419-4738-9246-f3d6b654c6f1.png)

## 内容

### フォームのコード（Bladeテンプレート）

* **ファイル**：`resources/views/message/create.blade.php`

```blade
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>メッセージ投稿</title>
</head>
<body>
    <h1>メッセージ投稿フォーム</h1>

    @if(session('success'))
        <p style="color:green">{{ session('success') }}</p>
    @endif

    <form action="/message" method="POST">
        @csrf
        <label>名前: <input type="text" name="name" required></label><br><br>
        <label>メッセージ:<br><textarea name="message" rows="5" cols="40" required></textarea></label><br><br>
        <button type="submit">送信</button>
    </form>
</body>
</html>
```

### コントローラーの処理

* **ファイル**：`app/Http/Controllers/MessageController.php`

```php
<?php

namespace App\Http\Controllers;

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

class MessageController extends Controller
{
    public function create()
    {
        return view('message.create');
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|max:255',
            'message' => 'required',
        ]);

        Message::create($validated);

        return redirect('/message')->with('success', '保存しました！');
    }
}
```

### モデル側の設定

* **ファイル**：`app/Models/Message.php`

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    // 保存を許可するカラムを指定
    protected $fillable = ['name', 'message'];
}
```

### マイグレーションの例

* **ファイル**：`database/migrations/2025_05_05_010232_create_messages_table.php`

```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('messages', function (Blueprint $table) {
            $table->id();
            $table->string('name');      // 名前
            $table->text('message');     // メッセージ
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('messages');
    }
};
```

### DB保存が成功している確認

* `phpMyAdmin` や `MySQL` クライアントから `messages` テーブルを参照し、投稿データが保存されていることを確認

* Laravel 側でリダイレクト後にメッセージが表示されていることも確認

![Screenshot 2025-05-10 at 12.12.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/8ffae643-03f0-4673-a76e-ed73523f1dd0.png)


## まとめ

Laravel を使ってフォームからメッセージを受け取り、バリデーションを通してデータベースに保存する処理がひと通り実装できました。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::


今後は投稿されたデータの一覧表示、編集・削除など CRUD 処理へステップアップしていく予定です。