【问题标题】:How to solve constructor injection of Zend\Session?如何解决 Zend\Session 的构造函数注入?
【发布时间】: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


【解决方案1】:

我不能 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)您可以将管理器注入到容器实例中。如果还有其他问题,我想更好地理解它们。

【讨论】:

  • 好的,所以我对此进行了更多思考并理解了更多。我写了一个后续问题,但认为它不符合 SO 问题的条件,而是提出了一个要点,云你验证我的想法,好吗? gist.github.com/4556064
猜你喜欢
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多