localdisk

PHP とか Java とか Web とか好きなことを書きます。

Laravel 5.2 でセッションがNULLになる時はミドルウェアを疑え

あけましておめでとうございます。今年もよろしくお願いします。

まずはこちらのエントリを参照してみてください。

Laravel 5.2 socialite twitter認証で$this->request->getSession()がnull | Romantique 76

はい、タイトルまんま。Laravel 5.2 でミドルウェアグループという機能ができました。複数ミドルウェアに名前をつけて登録できるというものです。で、この機能が実装されたため、5.1 でグローバルミドルウェアとして登録されていたものが web という名前のミドルウェアグループになってます(グローバルミドルウェアに登録されているのはメンテナンスチェックのみ)。

コードだと App\Http\Kernel クラスがそれになります。 アドベントカレンダーに書いてなくて申し訳ない。

https://github.com/laravel/laravel/blob/master/app/Http/Kernel.php#L26

そんなわけで、今までどおり書いてしまうとセッション等のミドルウェアを通過しなくなるので、なぜかセッションが作られない…どういうことなの…? となります注意してくださいね。下記のように書けばOKです。

<?php

Route::group(['middleware' => ['web']], function () {
    Route::get('/', function () {
        if (! Auth::check()) {
            return Redirect::to('github/authorize');
        }
    });

    Route::get('{provider}/authorize', function ($provider) {
        // ソーシャルログイン処理
        return Socialite::with($provider)->redirect();
    });

    Route::get('{provider}/login', function ($provider) {
        // ユーザー情報取得
        $userData = Socialite::with($provider)->user();
        dd($userData);
    });
});

RateLimit とか MultiAuth とか、書いてない新機能もありますので近いうちに書きます。