Laravel 5.7 でフォームからデータを受け取る( Request )

メモ:

Laravel 5.7 でフォームを使ったリクエストのデータをコントローラで受ける方法を見ていきます。

使用するファイルは、次の4つとなります。

app
    |-Http
         |-Controllers
                |-ContactController.php
resources
    |-views
         |-layouts
                |-default.blade.php
         |-contact
                |-form.blade.php
routes
    |-web.php

テンプレートの作成

テンプレートを用意します。

まず、次のようなベースとなるテンプレートを作成します。

<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css">

    <title>
        @section('title')
        @show
        : bnote
    </title>
</head>
<body>
    <div class="container">
        <div class="row">
            <h1>お問い合わせ</h1>
        </div>
        <div class="row">
            @yield('content')
        </div>
    </div>
</body>
</html>

次にフォーム部分を作成します。

form タグの action 部分は、他の書き方もできるようですがとりあえず直接指定します。

@extends('layouts.default')

@section('title','contact')

@section('content')
<form action="send" method="post">
<div class="form-group">
    <label for="InputEmail">メールアドレス</label>
    <input type="email" name="email" class="form-control" id="InputEmail">
</div>
<div class="form-group">
    <label for="InputSubject">件名</label>
    <input type="text" name="subject" class="form-control" id="InputSubject">
</div>
<div class="form-group">
    <label for="InputMessage">メッセージ</label>
    <textarea name="message" id="InputMessage" class="form-control" cols="40" rows="4"></textarea>
</div>
@csrf
<button type="submit" class="btn btn-primary">送信</button>
</form>
@endsection

フォームを作る上でポイントとなるのが 「@csrf」 の部分になります。デフォルトでは、このクロス・サイト・リクエスト・フォージェリ( CSRF )対策を行わないと 419 エラーが返されます。

419エラー

ルーティングの作成

http://[ホスト名]/hello/index へアクセスすると作成したテンプレートのフォームを出力するようルーティングを設定します。

次に form タグに設定した send に対応するよう POST メソッドで ContactController の send メソッドが呼ばれるようルーティングを設定します。

Route::get('/contact/index', function () {
    return view('contact.form');
});
Route::post('/contact/send', 'ContactController@send');

コントローラの作成

今回の作業のポイントとなる、送信ボタンが押された場合( POST メソッド)のコントローラを作成します。

Laravel 5.7 では、依存注入( DI )によりリクエストのインスタンスが取得できます。(Laravel の DI については別途調べたいと思います。)

この $request でフォームの値を受け取ることができます。個々の値は、 $request->input(‘name属性’) とすることで取得できます。

name属性は、テンプレートに定義した名前になります。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ContactController extends Controller
{
    //
    public function send(Request $request){
        $email = $request->input('email');
        $subject = $request->input('subject');
        $message = $request->input('message');

        return 'メッセージを送信しました。('.$subject.')';
    }
}

以上でフォームの値を受け取ることができるようになります。