Laravelでリクエストデータを取得する

# 目次
Laravelの記事一覧は下記
[PHPフレームワークLaravelの使い方](https://qiita.com/toontoon/items/c4d0371e504c37f6576e)

# Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています

# Laravelのリクエストデータ取得処理
Laravelでのリクエストデータ取得について書いていきます

# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成も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ファイル作成

```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ファイル作成

```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`

実行結果
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238103/d0a2e4d5-c9ee-1286-5e0a-654bbd9ae201.png)


`http://localhost/laravelSample/sample/request2`

実行結果
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238103/cc25b1b0-cc2e-71b3-f0e0-95c9161adace.png)

![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238103/a6384062-ea7e-feb5-d4dc-fa1e12c00ac2.png)

# 結果

| 取得メソッド | 取得値 |
|:-----------------|:------------------:|
| get         | クエリパラメータを取得、無ければリクエストボディから取得 |
| input       | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |
| request->get| postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |
| query->get  | クエリパラメータから取得 |
| query       | クエリパラメータから取得 |
| all         | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |
| only        | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |
| except      | postの場合リクエストボディから取得、getの場合クエリパラメータから取得 |