Laravelでフォームで送信した値を取得する方法をいくつか試してみます。
Request::input()
送信した値を取得する場合、Request::input()を使用します。
routes.php
Route::controller('/contact', 'ContactController');
ContactController.php
ページアクセス時はindexを、フォーム送信時はconfirmを表示するようにします。
<?php namespace App\Http\Controllers; use Request; class ContactController extends Controller { public function getIndex() { return view('contact.index'); } public function postIndex() { // nameの値があるとき if (Request::has('name')) { $name = Request::input('name'); } else { $name = '名無し'; } $age = Request::input('age'); $gender = Request::input('gender'); $favorite = Request::input('favorite'); $body = Request::input('body'); // job自体がないときは第2引数が返される $job = Request::input('job', '学生'); return view('contact.confirm', compact('name', 'age', 'gender', 'favorite', 'body', 'job')); } }
値があるかどうかを調べる場合はRequest::has()を使用します。
Request::input()に第2引数を指定すると、第1引数に指定したnameがない場合にその値を返します。
contact\index.blade.php
ページアクセス時に表示するビューです。
<form method="POST" action="/contact"> <dl> <dt>名前</dt> <dd><input type="text" name="name"></dd> </dl> <dl> <dt>年齢</dt> <dd> <select name="age"> <option value="">-----</option> <option value="15才">15才</option> <option value="16才">16才</option> <option value="17才">17才</option> <option value="18才">18才</option> </select> </dd> </dl> <dl> <dt>性別</dt> <dd> <input type="radio" name="gender" value="男性">男性 <input type="radio" name="gender" value="女性">女性 </dd> </dl> <dl> <dt>好み</dt> <dd> <input type="checkbox" name="favorite[]" value="食べること">食べること <input type="checkbox" name="favorite[]" value="猫">猫 <input type="checkbox" name="favorite[]" value="マヨネーズ">マヨネーズ </dd> </dl> <dl> <dt>内容</dt> <dd><textarea name="body"></textarea></dd> </dl> <input type="submit" value="送信"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> </form>
以下のようなフォームになります。
contact\confirm.blade.php
フォーム送信後に表示するビューです。
<dl> <dt>名前</dt> <dd>{{$name}}</dd> </dl> <dl> <dt>年齢</dt> <dd>{{$age}}</dd> </dl> <dl> <dt>性別</dt> <dd>{{$gender}}</dd> </dl> <dl> <dt>好み</dt> <dd> @for ($i = 0; $i < count($favorite); $i++) {{$favorite[$i]}} @endfor </dd> </dl> <dl> <dt>職業</dt> <dd>{{$job}}</dd> </dl> <dl> <dt>内容</dt> <dd>{{$body}}</dd> </dl>
$favoriteだけcheckboxで値が配列になっているので、for文で回します。
送信テストすると以下のように取得ができました。
Request::all()
Request::all()はPOSTした内容をすべて取得できます。
ContactController.php
コントローラーを以下のように書き換えます。
フォーム送信時にallを表示するように変更しました。
<?php namespace App\Http\Controllers; use Request; class ContactController extends Controller { public function getIndex() { return view('contact.index'); } public function postIndex() { $all = Request::all(); return view('contact.all', compact('all')); } }
all.blade.php
フォーム送信後に表示するビューです。
配列で返ってくるのでvar_dump()で表示するようにしています。
var_dump($all);
以下のような値が表示されました。
array(6) { ["name"]=> string(13) "西川 葉子" ["age"]=> string(5) "16才" ["gender"]=> string(6) "女性" ["favorite"]=> array(1) { [0]=> string(15) "マヨネーズ" } ["body"]=> string(21) "パンの耳ですわ" ["_token"]=> string(40) "xo9RN8yG4V1wtxce8g7FClDAszrYH8uQm05zAKwh" }
Request::only()
Request::only()はPOSTした内容の一部を取得したいときに使用します。
PHP
コントローラーを以下のように書き換えます。
今回はname,age,bodyを取得するようにしました。
<?php namespace App\Http\Controllers; use Request; class ContactController extends Controller { public function getIndex() { return view('contact.index'); } public function postIndex() { $only = Request::only('name', 'age', 'body'); return view('contact.only', compact('only')); } }
フォーム送信時にonlyを表示するように変更しています。
contact\only.blade.php
配列で返ってくるのでforeachで回しています。
@foreach ($only as $key => $value) <div>{{$key}}; {{$value}}</div> @endforeach
以下のように表示されました。
【参考サイト】
コメントが承認されるまで時間がかかります。