如何解决Zend \ Session的构造函数注入?

时间:2012-12-16 19:51:56

标签: php dependency-injection zend-framework2 zend-session

Zend Framework 2中的Session组件的体系结构尚未记录,我在理解它的实际应用时遇到了一些麻烦(例如,与非常直观的Symfony Session相比)。

重要部分的简短摘要:

  • Zend\Session\Storage\SessionStorage映射并替换$_SESSION superglobal
  • Zend\Session\SessionManager是管理存储,会话cookie,会话配置,会话验证等的外观。
  • Zend\Session\Container是旧Session_Namespace的替代品,不同的Container共享一个Manager实例(通过静态字段)。

没有代表名称空间(容器)集合的组件,因此无法使用'issetNamespaceX','unsetNamespaceX'等方法。 Nobody (包括Manager也是如此) as Storage了解容器,是否有,以及是否有多少名称。

Matthew Weier O'Phinney解释了这种情况如下:

  

Container是一个特殊的类,用于处理孤立的段   当前的Storage实例。 [...]如果有的话,存储适配器   将包含容器,而不是管理器。但是,我们也想   允许更多基本的存储使用,这使得容器   与存储正交,这解释了has-a的不同之处   关系。

关于正确的依赖注入,我看到了这个解决方案的一些实际问题。显然,管理器可以被视为具有相当长寿命的服务,因此有资格进行构造函数注入。不幸的是,管理器没有关于容器的任何线索,这也迫使我注入容器(坏因为相当短暂并且需要插槽),编写我自己的附加功能以使存储或管理器容器感知(应该是框架)功能)或在我的消费类中创建容器(我想明显避免)。

所以Zend解决方案对我来说似乎并不实用。如果我想使用Manager,FlashMessenger和一个额外的容器,我需要注入4(四个!)类。如果我对Symfony Session做同样的事情,我只需要注入1(一)个类。

此外,容器不符合注入条件,因为它们可能是短暂的运行时对象,在脚本执行期间可能存在或者可能不存在。使用Symfony Session这不是问题,因为Session知道它的包(容器),ZF2这是一个问题,因为管理器不知道容器。


主要问题:我如何在实践中使用Zend \ Session with Containers?

其他问题:是否有充分理由不提供类似于 ZF1 的真实命名空间功能,或者类似于 Symfony SessionBag

1 个答案:

答案 0 :(得分:5)

我不是100%确定我明白你遇到了什么问题。

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

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

你遇到的确切的问题是什么?上面没有解决?从您的描述中,它听起来像(a)您不知道容器与存储具有1:1的关系,以及(b)您可以将管理器注入容器实例。如果还有其他问题,我想更好地理解它们。