Zend Framework 2 中 Session 组件的体系结构还没有记录,我在理解它的实际用途时遇到了一些麻烦(例如,与非常直观的 Symfony Session 相比)。
重要部分的简短摘要:
Zend\Session\Storage\SessionStorage
映射和替换$_SESSION
超全局Zend\Session\SessionManager
是管理存储、会话 cookie、会话配置、会话验证等的门面。Zend\Session\Container
是旧的替代品Session_Namespace
,不同的 Container 共享一个 Manager 实例(通过静态字段)。
没有代表命名空间(容器)集合的组件,因此无法使用诸如“issetNamespaceX”、“unsetNamespaceX”等方法。没有人(包括管理器和存储)知道容器是否存在是任何,如果,多少有什么名字。
Matthew Weier O'Phinney 对这种情况的解释如下:
Container 是一个特殊的类,用于处理当前 Storage 实例的隔离段。[...] 如果有的话,存储适配器将包含容器,而不是管理器。但是,我们还希望允许更多基本的存储使用,这使得Container 与 Storage 正交,并解释了 has-a 关系的差异。
关于正确的依赖注入,我看到了这个解决方案的几个实际问题。显然,Manager 可以被视为具有相当长生命周期的服务,因此有资格进行构造函数注入。不幸的是,管理器对容器一无所知,这迫使我也注入容器(不好,因为寿命很短并且占用了插槽),编写我自己的附加功能以使存储或管理器感知容器(应该是框架功能)或在我的消费类中创建容器(我显然想避免)。
所以 Zend 解决方案对我来说似乎并不实用。如果我想使用 Manager、FlashMessenger 和一个额外的容器,我需要注入 4 个(四个!)类。如果我对 Symfony 会话做同样的事情,我只需要注入 1(一个)类。
此外,容器不符合注入条件,因为它们可能是短暂的运行时对象,在脚本执行期间的给定点可能存在也可能不存在。对于 Symfony Session,这不是问题,因为 Session 知道它的包(容器),对于 ZF2,这是一个问题,因为 Manager 不知道容器。
主要问题:在实践中我应该如何将 Zend\Session 与容器一起使用?
附加问题:是否有充分的理由不提供类似于ZF1或例如类似于Symfony SessionBag
的真正命名空间功能?