Laravelで簡単にお問い合わせフォームを作る方法【初心者向け】

Laravelを学び始めると「お問い合わせフォーム」を作りたい!と思う人は多いです😊 フォームはユーザーから情報を受け取る基本機能で、転職や副業でも必須スキルです。本記事では初心者向けに、Laravelで簡単にお問い合わせフォームを作る方法を解説します。

ルーティング・コントローラ・ビュー・バリデーション・メール送信・セキュリティ・DB保存まで一通り紹介するので、最後まで読めば実務でも使えるフォームを作れるようになります✨

フォームの処理フローをひと目で理解する図解

お問い合わせフォームの裏側で何が起きているかを、初心者でも直感でつかめるように図解しました。PCでは横並び、スマホでは縦カードで見やすく表示されます📱💡

🧑‍💻 ブラウザ フォーム送信 🧭 ルーティング routes/web.php 🧩 コントローラ ContactController@send バリデーション $request->validate() ✉️ メール送信 Mailable 💾 DB保存 contacts テーブル 🎉 レスポンス サンクス画面/リダイレクト 入力→送信
🧑‍💻 ブラウザ
ユーザーがフォームに入力して送信
🧭 ルーティング
POST /contact をコントローラに振り分け
🧩 コントローラ
リクエストを受け取り、処理をハンドリング
✅ バリデーション
$request->validate() で必須・形式チェック
✉️ メール送信
Mailable を使って通知を送信
💾 DB保存
contacts テーブルに履歴を保存
🎉 レスポンス
サンクスページへリダイレクト or 成功メッセージ表示
青系:受け付け~制御 緑系:検証・結果 橙系:外部処理(メール/DB)

お問い合わせフォームを作る流れ

Laravelでフォームを作る流れは大きく以下の通りです。

  • ルーティングを設定する
  • コントローラを作る
  • ビューを作成してフォームを表示する
  • バリデーションで入力チェックする
  • メール送信処理を追加する
  • 必要に応じてDBに保存する
  • セキュリティ対策をする

これを順番にやっていきましょう🚀

ルーティングの設定

まずはフォームを表示するルートと、送信処理を行うルートを設定します。


// routes/web.php
use App\Http\Controllers\ContactController;

Route::get('/contact', [ContactController::class, 'index']);
Route::post('/contact', [ContactController::class, 'send']);
      

GET でフォーム画面を表示し、POST で送信処理を実行します。

コントローラの作成

次にコントローラを作ります。


php artisan make:controller ContactController
      

作成された app/Http/Controllers/ContactController.php を編集します。


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Mail\ContactMail;
use Illuminate\Support\Facades\Mail;
use App\Models\Contact;

class ContactController extends Controller
{
    public function index()
    {
        return view('contact.index');
    }

    public function send(Request $request)
    {
        $request->validate([
            'name' => 'required|max:50',
            'email' => 'required|email',
            'message' => 'required|min:10|max:500',
        ]);

        $data = $request->all();

        // メール送信
        Mail::to('[email protected]')->send(new ContactMail($data));

        // DB保存(任意)
        Contact::create($data);

        return back()->with('success', 'お問い合わせを送信しました!');
    }
}
      

index でフォームを表示し、send で送信処理と保存を行います。

ビューの作成

フォームを表示するビューを作ります。resources/views/contact/index.blade.php を作成しましょう。


@extends('layouts.app')

@section('content')
<div class="container">
  <h2>お問い合わせフォーム</h2>
  @if(session('success'))
    <div class="alert alert-success">{{ session('success') }}</div>
  @endif
  <form method="POST" action="/contact">
    @csrf
    <div class="form-group">
      <label>お名前</label>
      <input type="text" name="name" class="form-control" value="{{ old('name') }}">
      @error('name') <span class="text-danger">{{ $message }}</span> @enderror
    </div>
    <div class="form-group">
      <label>メールアドレス</label>
      <input type="email" name="email" class="form-control" value="{{ old('email') }}">
      @error('email') <span class="text-danger">{{ $message }}</span> @enderror
    </div>
    <div class="form-group">
      <label>お問い合わせ内容</label>
      <textarea name="message" class="form-control">{{ old('message') }}</textarea>
      @error('message') <span class="text-danger">{{ $message }}</span> @enderror
    </div>
    <button type="submit" class="btn btn-primary">送信</button>
  </form>
</div>
@endsection
      

モデルとマイグレーションの作成

お問い合わせをデータベースに保存したい場合はモデルとマイグレーションを作ります。

php artisan make:model Contact -m

マイグレーションファイルを編集します。

// database/migrations/xxxx_xx_xx_create_contacts_table.php
public function up()
{
    Schema::create('contacts', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email');
        $table->text('message');
        $table->timestamps();
    });
}

これで送信内容をDBに保存できるようになります。

メール送信の実装

お問い合わせフォームではメール送信が定番です。Laravelでは Mailable クラスを使います。

php artisan make:mail ContactMail

作成された app/Mail/ContactMail.php を編集します。

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ContactMail extends Mailable
{
    use Queueable, SerializesModels;

    public $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function build()
    {
        return $this->subject('お問い合わせありがとうございます')
                    ->view('emails.contact');
    }
}

メール本文のビューを作ります。

// resources/views/emails/contact.blade.php

名前: {{ $data['name'] }}

メール: {{ $data['email'] }}

メッセージ: {{ $data['message'] }}

これで送信先にメールが届くようになります📩

レスポンシブなフォームデザイン

お問い合わせフォームはスマホでも見やすい必要があります。Tailwindを使えばかんたんにレスポンシブ対応になります。こんな感じのフォームが表示できれいればOK

<div class="max-w-xl mx-auto p-6 bg-white rounded-lg shadow-md">
  <h2 class="text-2xl font-bold mb-6 text-center text-gray-800">お問い合わせフォーム</h2>
  <form action="#" method="POST" class="space-y-4">
    <div>
      <label for="name" class="block text-sm font-medium text-gray-700">お名前</label>
      <input type="text" id="name" name="name" required
        class="mt-1 block w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
    </div>
    <div>
      <label for="email" class="block text-sm font-medium text-gray-700">メールアドレス</label>
      <input type="email" id="email" name="email" required
        class="mt-1 block w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
    </div>
    <div>
      <label for="message" class="block text-sm font-medium text-gray-700">お問い合わせ内容</label>
      <textarea id="message" name="message" rows="5" required
        class="mt-1 block w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"></textarea>
    </div>
    <div>
      <button type="submit"
        class="w-full bg-blue-600 text-white font-semibold py-2 px-4 rounded-md hover:bg-blue-700 transition-colors duration-200">
        送信する
      </button>
    </div>
  </form>
</div>

セキュリティとバリデーション

お問い合わせフォームでは、不正な入力を防ぐことが大事です。

  • CSRF対策: Laravelは @csrf で自動対応
  • バリデーション: 必須チェック、最大文字数、メール形式
  • XSS対策: Bladeの {{ }} は自動エスケープ
  • reCAPTCHA: スパム送信防止に有効

初心者はまず $request->validate() を活用しましょう🔐

Laravelの教科書 バージョン10対応 [ 加藤 じゅんこ ]

価格:3300円
(2025/9/10 10:59時点)
感想(0件)

基礎から学ぶ Laravel【電子書籍】[ 佐野大樹 ]

価格:3584円
(2025/9/10 10:59時点)
感想(0件)

 

よくあるエラーと対処法

フォーム実装で初心者がつまずくエラーを紹介します。

エラー: Class "App\Mail\ContactMail" not found

use App\Mail\ContactMail; をコントローラに追加していない可能性があります。

エラー: SQLSTATE[HY000] [1045] Access denied

→ DB接続設定が間違っている可能性があります。.env を確認しましょう。

エラー: Connection could not be established with host

.env のメール設定(MAIL_HOST 等)が正しいか確認してください。

エラー: CSRF token mismatch

→ フォームに @csrf を入れ忘れている可能性があります。

初心者向けFAQ

Q. メールが届かないときは?

A. .envMAIL_HOSTMAIL_USERNAME を確認してください。ローカル開発ではMailhogなどを使うと便利です。

Q. フォーム内容をDBに保存するには?

A. モデルとマイグレーションを作成し、Contact::create($request->all()) を実行すれば保存できます。

Q. 簡単にフォームを作る方法はある?

A. Laravel Collectiveを使うとフォームタグ生成が簡単になります。ただし初心者はまずBladeで書くことをおすすめします。

Q. 送信後にサンクスページを表示したい

A. return redirect('/thanks'); で専用ページに遷移させましょう。

Q. 添付ファイルを送信するには?

A. $request->file('file')->store() を利用し、Mailableで添付すれば可能です。

まとめ

Laravelでお問い合わせフォームを作る手順を解説しました。ルーティング・コントローラ・ビュー・バリデーション・メール送信・DB保存・セキュリティ対策を順番に学ぶことで、初心者でも実用的なフォームを作れるようになります🎉

フォーム実装はLaravel学習の最初の山場ですが、達成感が大きい機能です。副業や転職でも活かせるので、ぜひ挑戦してみてください💪