目次
Laravelの記事一覧は下記
PHPフレームワークLaravelの使い方
Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています
Laravelのリクエストデータ取得処理
Laravelでのリクエストデータ取得について書いていきます
前提条件
eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています
Controllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpにrequest1メソッド、request2メソッドを追記
public function request1(Request $request)
{
$request->flash();
$data = [
'get' => $request->get('a'),
'input' => $request->input('a'),
'request_get' => $request->request->get('a'),
'query_get' => $request->query->get('a'),
'query' => $request->query('a'),
'all' => var_export($request->all(), true),
'only' => var_export($request->only(['a', 'b']), true),
'except' => var_export($request->except(['b']), true),
];
return view('sample.request1', $data);
}
public function request2(Request $request)
{
$request->flash();
$data = [
'get' => $request->get('a'),
'input' => $request->input('a'),
'request_get' => $request->request->get('a'),
'query_get' => $request->query->get('a'),
'query' => $request->query('a'),
'all' => var_export($request->all(), true),
'only' => var_export($request->only(['a', 'b']), true),
'except' => var_export($request->except(['b']), true),
];
return view('sample.request2', $data);
}
$request->flash()はリクエストデータを
次のユーザーリクエストの処理中だけ利用できるフラッシュデータとしてセッションに保存します。
(2) /sample/routes/web.phpに下記を追記
Route::get('sample/request1', 'SampleController@request1');
Route::match(['get', 'post'],'sample/request2', 'SampleController@request2');
viewの作成
(1) /sample/resources/views/sample/request1.blade.phpファイル作成
<html>
<head>
<title>sample</title>
</head>
<body>
<form action="{{ url('sample/request1') }}" method="get">
<div>a<input type="text" name="a" value="{{ old('a') }}"></div>
<div>b<input type="text" name="b" value="{{ old('b') }}"></div>
<div>c<input type="text" name="c" value="{{ old('c') }}"></div>
<input type="submit" >
</form>
<div>get:{{$get}}</div>
<div>input:{{$input}}</div>
<div>request_get:{{$request_get}}</div>
<div>query_get:{{$query_get}}</div>
<div>query:{{$query}}</div>
<div>all:{{$all}}</div>
<div>only:{{$only}}</div>
<div>except:{{$except}}</div>
</body>
</html>
(2) /sample/resources/views/sample/request2.blade.phpファイル作成
<html>
<head>
<title>sample</title>
</head>
<body>
<form action="{{ url('sample/request2') }}?a=q_a&b=q_b&c=q_c" method="post">
@csrf
<div>a<input type="text" name="a" value="{{ old('a') }}"></div>
<div>b<input type="text" name="b" value="{{ old('b') }}"></div>
<div>c<input type="text" name="c" value="{{ old('c') }}"></div>
<input type="submit" >
</form>
<div>get:{{$get}}</div>
<div>input:{{$input}}</div>
<div>request_get:{{$request_get}}</div>
<div>query_get:{{$query_get}}</div>
<div>query:{{$query}}</div>
<div>all:{{$all}}</div>
<div>only:{{$only}}</div>
<div>except:{{$except}}</div>
</body>
</html>
{{ old() }}は$request->flash()でセッションに入れたデータを取得します
@csrf
はクロスサイトリクエストフォージェリ対策のトークンをhiddenで出してくれます
クロスサイトリクエストフォージェリとは、簡単に言うと、直接アクセスされたら困る画面にアクセスできてしまう脆弱性です。
例えば、ECサイトにログインした状態で悪意あるサイトにアクセスして、その悪意あるサイトからECサイトの商品購入完了画面にpost送信されると意図しない商品が購入されていまうというのが1例です。
クロスサイトリクエストフォージェリ対策とは、サーバー上でワンタイムパスワードを生成→セッションに保存→inputタグのtype=hiddenで画面に出力→次のリクエストで飛んできたtype=hiddenのワンタイムパスワードとセッションに保存してあるワンタイムパスワードが一致するかチェック→一致しない場合エラーとするというものです
Laravelではこの対策をapp/Http/Middleware/VerifyCsrfToken.phpで行ってくれています
動作確認
http://localhost/laravelSample/sample/request1
http://localhost/laravelSample/sample/request2
結果
取得メソッド | 取得値 |
---|---|
get | クエリパラメータを取得、無ければリクエストボディから取得 |
input | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |
request->get | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |
query->get | クエリパラメータから取得 |
query | クエリパラメータから取得 |
all | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |
only | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |
except | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |