【发布时间】:2013-01-17 21:29:45
【问题描述】:
Zend Framework 2 中 Session 组件的架构尚未记录在案,我在理解它的实际用途时遇到了一些麻烦(例如,与非常直观的 Symfony Session 相比)。
重要部分的简短摘要:
-
Zend\Session\Storage\SessionStorage映射和替换$_SESSION超全局 -
Zend\Session\SessionManager是一个门面,用于管理存储、会话 cookie、会话配置、会话验证等。 -
Zend\Session\Container是旧Session_Namespace的一种替代品,不同的 Container 共享一个 Manager 实例(通过静态字段)。
没有代表命名空间(容器)集合的组件,因此无法使用“issetNamespaceX”、“unsetNamespaceX”等方法。没有人(包括管理器) as Storage) 知道容器,是否有容器,如果有,有多少,名称是什么。
Matthew Weier O'Phinney 对这种情况的解释如下:
Container 是一个特殊的类,用于处理 当前存储实例。 [...] 如果有的话,一个存储适配器 将包含容器,而不是管理器。不过,我们也想 允许更基本的存储使用,这使得 Container 与 Storage 正交,这解释了 has-a 的区别 关系。
我看到这个解决方案在正确的依赖注入方面存在一些实际问题。显然,Manager 可以被视为一个生命周期相当长的服务,因此有资格进行构造函数注入。不幸的是,管理器对容器一无所知,这迫使我也注入容器(不好,因为寿命很短并且占用插槽),编写我自己的附加功能以使存储或管理器感知容器(应该是框架功能)或在我的消费类中创建容器(我显然想避免)。
所以 Zend 解决方案对我来说似乎并不实用。如果我想使用 Manager、FlashMessenger 和一个额外的容器,我需要注入 4 个(四个!)类。如果我对 Symfony Session 做同样的事情,我只需要注入 1(一个)类。
此外,容器不符合注入条件,因为它们可能是短暂的运行时对象,在脚本执行期间的给定时间点可能存在也可能不存在。对于 Symfony Session,这不是问题,因为 Session 知道它的包(容器),对于 ZF2,这是一个问题,因为 Manager 不知道容器。
主要问题:在实践中我应该如何将 Zend\Session 与容器一起使用?
附加问题:是否有充分的理由不提供类似于 ZF1 或例如类似于 Symfony SessionBag 的真正命名空间功能?
【问题讨论】:
-
使用容器非常简单,只需实例化并使用它们:
$cnt = new Container('namespaceName'); $cnt['myData'] = 'someValue';您还需要做些什么吗? // 编辑:据我了解,容器代表 $_SESSION 的键(如果使用默认存储)。 -
是的,使用容器很容易,更多的问题是如何在完全启用 DI 的环境中使用它们。
-
而且,正如我所说,如何管理它们!
-
目前,我正在使用 Symfony\Component\HttpFoundation\Session\Session 来替换 ZF2 应用程序中的 Zend Session,因为它易于理解、记录在案并且完全符合我的预期。当我收到 ZF 的消息或文档已经发布时,我会重新讨论这个话题。
-
这意味着我也必须注入 flashMessenger,一个更多的依赖项......我开始认为我的问题写得不好。你似乎没明白我想说什么。
标签: php dependency-injection zend-framework2 zend-session