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学習の最初の山場ですが、達成感が大きい機能です。副業や転職でも活かせるので、ぜひ挑戦してみてください💪