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

mar*_*kus 10 php dependency-injection zend-session zend-framework2

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

重要部分的简短摘要:

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

没有代表名称空间(容器)集合的组件,因此无法使用'issetNamespaceX','unsetNamespaceX'等方法.没有人(包括Manager和Storage)知道容器,是否存在是什么,如果,有多少名称.

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

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

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

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

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


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

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

wei*_*ney 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)您可以将管理器注入容器实例.如果还有其他问题,我想更好地理解它们.