Zend Framework 2 のセッション コンポーネントのアーキテクチャはまだ文書化されておらず、実際の使用法を理解するのに苦労しています (たとえば、非常に直感的な Symfony セッションと比較して)。
重要な部分の短い要約:
Zend\Session\Storage\SessionStorage
$_SESSION
スーパーグローバルをマッピングして置き換えますZend\Session\SessionManager
ストレージ、セッション Cookie、セッション構成、セッション検証などを管理するためのファサードです。Zend\Session\Container
は、古い の一種の代替でありSession_Namespace
、異なるコンテナが 1 つの Manager インスタンスを共有します (静的フィールドを介して)。
名前空間 (コンテナー) のコレクションを表すコンポーネントがないため、「issetNamespaceX」、「unsetNamespaceX」などのメソッドを使用する方法はありません。誰も(ストレージだけでなくマネージャーも含めて) コンテナーについて知りません。ある場合は、どのような名前でいくつありますか。
Matthew Weier O'Phinney は、この状況を次のように説明しています。
Container は、現在の Storage インスタンスの分離されたセグメントを操作するための特別なクラスです。[...] どちらかといえば、ストレージ アダプタにはマネージャではなくコンテナが含まれます。ただし、ストレージのより基本的な使用法も許可したいと考えています。これにより、コンテナーはストレージと直交し、has-a 関係の違いが説明されます。
適切な依存性注入に関して、このソリューションにはいくつかの実際的な問題があります。明らかに、マネージャーはかなり長い有効期間を持つサービスと見なすことができるため、コンストラクター注入の資格があります。残念ながら、マネージャーはコンテナーについての手がかりがないため、コンテナーも注入する必要があり (かなり短命でスロットを奪うため悪い)、独自の追加機能を記述してストレージまたはマネージャーをコンテナー対応にする必要があります (フレームワークである必要があります)。機能) または私の消費クラスでコンテナを作成します (これは明らかに避けたいです)。
したがって、Zend ソリューションは私には実用的ではないようです。Manager、FlashMessenger、および追加のコンテナーを使用する場合は、4 つ (4 つ!) のクラスを注入する必要があります。Symfony セッションで同じことを行う場合、1 つのクラスを注入するだけで済みます。
さらに、コンテナは潜在的に短命の実行時間オブジェクトであり、スクリプト実行中の特定の時点で存在する場合と存在しない場合があるため、インジェクションの対象にはなりません。Symfony セッションでは、セッションがそのバッグ (コンテナー) を認識しているため、これは問題ではありません。ZF2 では、マネージャーがコンテナーを認識していないため、これは問題です。
主な質問: Zend\Session をコンテナで実際に使用するにはどうすればよいですか?
追加の質問: ZF1に似た、またはたとえばSymfony SessionBag
に似た実際の名前空間機能を提供しない正当な理由はありますか?