Laravelを学び始めると「お問い合わせフォーム」を作りたい!と思う人は多いです😊 フォームはユーザーから情報を受け取る基本機能で、転職や副業でも必須スキルです。本記事では初心者向けに、Laravelで簡単にお問い合わせフォームを作る方法を解説します。
ルーティング・コントローラ・ビュー・バリデーション・メール送信・セキュリティ・DB保存まで一通り紹介するので、最後まで読めば実務でも使えるフォームを作れるようになります✨
フォームの処理フローをひと目で理解する図解
お問い合わせフォームの裏側で何が起きているかを、初心者でも直感でつかめるように図解しました。PCでは横並び、スマホでは縦カードで見やすく表示されます📱💡
お問い合わせフォームを作る流れ
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円  | 
よくあるエラーと対処法
フォーム実装で初心者がつまずくエラーを紹介します。
エラー: 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. .env の MAIL_HOST や MAIL_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学習の最初の山場ですが、達成感が大きい機能です。副業や転職でも活かせるので、ぜひ挑戦してみてください💪