10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-02

目次

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

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

http://localhost/laravelSample/sample/request2

実行結果
b.png

c.png

結果

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?