PHP
laravel

LaravelでSessionをコンストラクタで使うときの注意点

LaravelでSessionに何かを入れておく処理を書いて、一度アクセス(セッションに保存)しておき、、

class LoginUserController extends Controller
{
    public function index(Request $request)
    {
            $token = 'hoge';
            // セッションIDの発行
            session()->regenerate();
            // セッションへデータを保存する
            session(['token' => $token]);

            $token = session('accessToken'); // セッションからデータを取り出す
            Log::debug($token); // ちゃんと表示される
        }
}

別のControllerのコンストラクタで(以後のアクセスの際に)Sessionから値を取り出そうとすると、あるはずの値がない。

class HogeController extends Controller
{
    public function __construct()
    {
        $token = session('accessToken');
        Log::debug($token);
    }

    public function index()
    {
        // 
    }
}

logは空文字。


対処法

Kernel.phpの以下を変更すると治る。

app/Http/Kernel.php
class Kernel extends HttpKernel
{
    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Session\Middleware\StartSession::class,                   // ここを追加
    ];

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            // \Illuminate\Session\Middleware\StartSession::class,        // コメントアウト
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
}