47.

【Laravel】セッションの値の取得/保存/更新/削除

編集
この記事の要点
  • Laravel でのセッション操作: session() ヘルパ or $request->session()
  • 取得: session('key') / session()->get('key', default)
  • 保存/更新: session(['key' => value]) / session()->put('key', value)
  • 削除: session()->forget('key') / session()->flush() (全クリア)
  • Flash: session()->flash('key', value) (次リクエストのみ)

 

セッションへの保存・取得

// 保存
session(['user_id' => 123, 'role' => 'admin']);
session()->put('user_id', 123);
$request->session()->put('cart', $cartItems);

// 取得
$userId = session('user_id');
$role = session()->get('role', 'guest');  // デフォルト値付き
$userId = $request->session()->get('user_id');

// 存在チェック
if (session()->has('user_id')) { ... }
if (session()->exists('user_id')) { ... }  // null でも true

// 全データ取得
$all = session()->all();
$all = $request->session()->all();

更新

// 既存セッション値を更新 (put で上書き)
session(['cart' => $newCartItems]);

// 取り出して更新 (配列やオブジェクト)
$cart = session()->get('cart', []);
$cart[] = $newItem;
session(['cart' => $cart]);

// push (配列に追加)
session()->push('cart', $newItem);
session()->push('tags', 'newtag');  // tags は配列

// 増加 (カウンタ用)
session()->increment('count');
session()->increment('count', 5);  // +5
session()->decrement('count');

削除

// 特定キーを削除
session()->forget('user_id');
session()->forget(['user_id', 'role']);  // 複数

// 全削除
session()->flush();

// 値取得 + 削除
$value = session()->pull('key', 'default');
// → 取得して同時に削除

// セッション ID 再生成 (ログイン時等のセキュリティ)
session()->regenerate();
session()->regenerateToken();  // CSRF トークンのみ

Flash データ (次リクエストのみ)

// 次のリクエストでのみ取得可
session()->flash('success', '保存しました');

// または
$request->session()->flash('message', 'OK');

// 次のリクエストで取得
session('success');  // → "保存しました"
// その次のリクエストでは null

// flash を再度残す
session()->reflash();           // 全 flash
session()->keep(['success']);  // 特定キーだけ

// リダイレクトで一緒に
return redirect('/users')->with('success', '登録完了');

Blade での Flash 表示


@if (session('success'))
    
{{ session('success') }}
@endif @if (session('error'))
{{ session('error') }}
@endif @error('email') {{ $message }} @enderror @if ($errors->any())
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif

セッションドライバ

# config/session.php または .env で指定
SESSION_DRIVER=file        # storage/framework/sessions/ にファイル
SESSION_DRIVER=cookie      # Cookie 直接 (容量制限あり)
SESSION_DRIVER=database    # DB (sessions テーブル)
SESSION_DRIVER=redis       # Redis (高速・分散環境)
SESSION_DRIVER=memcached   # Memcached
SESSION_DRIVER=array       # メモリ (テスト用)

# DB ドライバの場合 sessions テーブル作成
$ php artisan session:table
$ php artisan migrate

セッション有効期限

# config/session.php または .env
SESSION_LIFETIME=120       # 分単位 (デフォルト 2 時間)
SESSION_EXPIRE_ON_CLOSE=false  # true: ブラウザ閉じたらクリア

# Cookie の設定
SESSION_DOMAIN=null         # 共有ドメイン
SESSION_SECURE_COOKIE=true  # HTTPS のみ
SESSION_HTTP_ONLY=true       # JS からアクセス不可
SESSION_SAME_SITE=lax       # CSRF 防御 (strict / lax / none)

セキュリティのベストプラクティス

① ログイン時にセッション ID 再生成

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();  // セッションフィクセーション対策
        return redirect()->intended('/dashboard');
    }

    return back()->withErrors(['email' => '認証失敗']);
}

② 機密情報を保存しない

// ❌ ダメ
session(['password' => $password]);
session(['credit_card' => $cc]);
session(['token' => $apiToken]);

// ✅ 良い: 一時的な参照だけ
session(['user_id' => $user->id]);  // → DB から都度取得
session(['cart_id' => $cart->id]);

③ Cookie 暗号化 (デフォルト)

// app/Http/Middleware/EncryptCookies.php
class EncryptCookies extends Middleware {
    protected $except = [
        // 暗号化しない Cookie
    ];
}

// セッションクッキー (laravel_session) は自動で暗号化

セッションのデバッグ

// 全セッション値を確認
dd(session()->all());
Log::info('Session', session()->all());

// 特定キー
dd(session('user_id'));

// Tinker
$ php artisan tinker
>>> session()->all()
>>> session(['test' => 'value'])
>>> session('test')

// セッションファイル直接確認 (file ドライバ)
$ ls -la storage/framework/sessions/
$ cat storage/framework/sessions/abc123...

API では Session 不要

// REST API は通常ステートレス → セッション不使用
// 代わりに JWT / Sanctum で認証

// API ルートはデフォルトでセッションミドルウェアなし
// (routes/api.php は web ミドルウェアグループ外)

// Sanctum SPA 認証では cookie 経由のセッション利用

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)