Laravel 画面を一度リロードしないとCookieが表示されない

こんにちは。今回はLaravelで一度リロードしないとCookieの値が表示されない現象について解説します。

現象

viewにcookieの値を表示させたい場合、以下のようにviewメソッドにcookieを付与して返すと、viewにcookieが表示されず、画面を一度リロードするとviewにcookieが表示されるという現象が発生します。

// routing
Route::post('/cookie', function (Request $request) {
    // cookieを付与
    return response()->view('cookie')->cookie('test', $request->test, 1);
});

// view
{{ Cookie::get('test'); }} // Cookieの値が表示されない

原因

Viewの描画段階でCookieが未だ存在していないことが原因です。Cookie::getでCookieの値を取得することができます。しかし参照できる値は一度レスポンスヘッダにCookieを付与してクライアントに返し、クライアントが次のリクエストでサーバーに送付したCookieです。ですのでクライアントに返す前のCookieを参照できていないことが原因です。

解決策

Cookieを発行した後、リダイレクトさせればCookieを参照することができます。リダイレクトは特定のURLに対してgetリクエストを発生させるため、Cookieをクライアントに返し、クライアントがCookieを送り返す処理を発生させることができます。これにより、リダイレクト先の画面でCookieを参照することができます。

Route::post('/cookie', function (Request $request) {
    // cookieを新たに発行する
    Cookie::queue('test', $request->test, 1);

    // cookie.blade.phpへリダイレクト
    return redirect('/cookie');
});

まとめ

今回はCookieに関するtipsを紹介しました。Cookieのことがよく判っていないうちは陥りがちなので、参考にしていただければと思います。

Laravel

Posted by kobainmac