10

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的真正命名空间功能?

4

1 回答 1

5

我不是 100% 确定我了解您遇到的问题。

首先, a 的构造函数Container接受容器的命名空间以及可选的Manager实例:$container = new Container('your container namespace here', $manager)。您也可以指定要使用的默认管理器实例:Container::setDefaultManager($manager).

其次,a仅表示所用实例Container中的命名数组。Storage因此,您可以通过isset($storage['your container namespace here'])调用来测试容器是否存在。

您遇到了哪些具体问题无法解决以上问题?根据您的描述,听起来(a)您不知道容器与存储具有 1:1 的关系,并且(b)您可以将管理器注入到容器实例中。如果还有其他问题,我想更好地理解它们。

于 2013-01-11T14:51:13.203 回答