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 エラーが返されます。
ルーティングの作成
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.')';
}
}
以上でフォームの値を受け取ることができるようになります。