QA@IT

Zend Framework 2 のセッションストレージクラスの違いについて

3798 PV

Zend Framework 2 のセッションストレージクラスについて、Zend Framework 2徹底解説 には次のように書かれていますが、違いがよくわかりません。もう少し詳しく教えていただけないでしょうか。

  • Zend\Session\Storage\ArrayStorage

    セッション情報を配列として管理します。「$_SESSION」を介したアクセスはできません。

  • Zend\Session\Storage\SessionStorage

    「$_SESSION」に保存されるすべての配列情報を管理します。「$_SESSION」を介したアクセスも可能です。

  • Zend\Session\Storage\SessionArrayStorage

    直接「$_SESSION」に対して値の出し入れを行います。

回答

ストレージの実装が、ArrayStorageはArrayObject、SessionStorageはArrayStorage(つまりArrayObjectの拡張)、SessionArrayStorageは$_SESSION配列ということだと思います。

SessionStorageを使うと、$_SESSIONそのものがSessionStorageオブジェクトになるけど、配列アクセスを実装しているので$_SESSIONへの直接アクセスが有効。
SessionArrayStorageは透過的に$_SESSIONへアクセスしているだけなので、当然$_SESSIONへの直接アクセスは有効です。

ArrayStorageはアクセス毎に値がセットされないので、カスタムストレージを用意する際の基本クラスとして用意されているのかな、という印象です。
ちゃんと使うとなると、StorageInitializationInterfaceを実装する必要があると思います。

あくまでストレージクラスなので、「どこに保存されるのか」が重要でないなら、あまり気にせずデフォルト(SessionArrayStorage)のままで良いような気がします。

ざっとソースとドキュメントを眺めてみた感想です。

編集 履歴 (0)
  • 詳しいご回答ありがとうございます!ngyukiさんのご回答と合わせて理解し、どれを使ったらいいかの判断はできました! -

ArrayStorage

  • $_SESSION への値の格納は register_shutdown_function で終了時に行われます
    • よってアプリで $_SESSION を直接使うことはできません
    • 直接 $_SESSION に値を格納してもリクエスト終了時に上書きされます
  • リクエスト開始時に $_SESSION からのセッションの復元が行われません
    • 自前で ArrayStorage のプロパティをセットする必要があります

SessionStorage

  • $_SESSION を SessionStorage のインスタンスに置き換えます
  • $_SESSION instanseof SessionStorage; // true

SessionArrayStorage

  • SessionArrayStorage の __get や offsetGet で $_SESSION の要素の参照を返します
  • $_SESSION はただの配列のままで SessionArrayStorage が返す参照経由でセッション変数を操作します
編集 履歴 (0)
  • 被った>< -
  • 詳しいご回答ありがとうございました!先にご回答いただいたtsurumauさんの回答をacceptしましたが、実際は甲乙付けがたく、ngyukiさんのご回答もとても参考になりました! -
ウォッチ

この質問への回答やコメントをメールでお知らせします。