Help us understand the problem. What is going on with this article?

Laravelでセッションを利用できるまでの準備の流れ

laravelでのsession

laravelではセッションの起点が\Illuminate\Session\Middleware\StartSessionというミドルウェアになります。

/Illuminate/Session/Middleware/StartSession
public function handle($request, Closure $next)
{
    if (! $this->sessionConfigured()) {
        return $next($request);
    }

    $request->setLaravelSession(
        $session = $this->startSession($request)
    );

    $this->collectGarbage($session);

    $response = $next($request);

    $this->storeCurrentUrl($request, $session);

    $this->addCookieToResponse($response, $session);

    $this->saveSession($request);

    return $response;
}

$this->sessionConfigured()でセッションを開始するかどうかを判定しています。

laravelではセッションの設定はconfig/sessionに記述していきます。そのファイルがなかったり、driverがnullだったりするとセッションは使われません。

sessionの開始

$request->setLaravelSession()はリクエストのプロパティに生成したセッションをセットしているだけなので、実質的な処理は$this->startSessionになります。

/Illuminate/Session/Middleware/StartSession
protected function startSession(Request $request)
{
    return tap($this->getSession($request), function ($session) use ($request) {
        $session->setRequestOnHandler($request);

        $session->start();
    });
}

sessionの取得

$this->getSession()でセッションの取得を行っていきます。

/Illuminate/Session/Middleware/StartSession
public function getSession(Request $request)
{
    return tap($this->manager->driver(), function ($session) use ($request) {
        $session->setId($request->cookies->get($session->getName()));
    });
}

/Illuminate/Session/SessionManagerdriver()を呼んでドライバーの取得をしています。driver()自体はスーパークラスの/Illuminate/Support/Managerに実装されており、最終的にSessionManager::createNativeDriverが呼ばれます。

ドライバーとはセッションの値をどこに保存するかを決めるもので、デフォルトではfileになっていて、databaseなどにも変更できるようです。

/Illuminate/Session/SessionManager
protected function createNativeDriver()
{
    $lifetime = $this->config->get('session.lifetime');

    return $this->buildSession(new FileSessionHandler(
        $this->container->make('files'), $this->config->get('session.files'), $lifetime
    ));
}

$this->buildSession()にセッション用のファイルハンドラを渡してセッションを生成してそうです。

/Illuminate/Session/SessionManager
protected function buildSession($handler)
{
    return $this->config->get('session.encrypt')
            ? $this->buildEncryptedSession($handler)
            : new Store($this->config->get('session.cookie'), $handler);
}

$this->config->get('session.encrypt')はデフォルトではfalseなので、ここで本体である/Illuminate/Session/Storeが生成されています。

ここで第一引数に渡している文字列はcookieのNameとして使われています。(APP_NAME_session)ブラウザでも確認することができますね!

セッションIDのセット

セッションをのインスタンスを取得したので、getSession()に戻って、tap関数でidをセットしていきます。

$session->setId($request->cookies->get($session->getName()));

先程new Store()の第一引数に渡した文字列を使って、cookieからidを取得しています。もしidがなければidを生成してセットしてくれます。

セッションの開始

無事にセッションを取得できたので、セッションを開始してきます。

$session->setRequestOnHandler($request)はデフォルトでは関係ないので割愛)

/Illuminate/Session/Middleware/StartSession
protected function startSession(Request $request)
{
    return tap($this->getSession($request), function ($session) use ($request) {
        $session->setRequestOnHandler($request);

        $session->start();
    });
}
/Illuminate/Session/Store
public function start()
{
    $this->loadSession();

    if (! $this->has('_token')) {
        $this->regenerateToken();
    }

    return $this->started = true;
}

loadSession()でfileからセッションに格納している値を読み出してきます。

その中に_token(CSRF用)がなければトークンを生成します。

以上でセッションを利用する準備が整いました!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした