php - Zend\Session构造函数注入(inject)如何解决?

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

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

重要部分的简短总结:

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

没有表示命名空间(容器)集合的组件,因此无法使用“issetNamespaceX”、“unsetNamespaceX”等方法。没有人(包括管理器)作为存储)知道容器,是否有容器,如果有,有多少容器,名称是什么。

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

The Container is a special class for working with isolated segments of the current Storage instance. [...] If anything, a Storage adapter would contain Containers, not the Manager. However, we also want to allow more basic usage of storage, which makes the Container orthogonal to Storage, and which explains the difference in has-a relations.

我发现此解决方案在正确的依赖项注入(inject)方面存在一些实际问题。显然,Manager 可以被视为具有相当长生命周期的服务,因此符合构造函数注入(inject)的条件。不幸的是,管理器对容器一无所知,这迫使我也注入(inject)容器(不好,因为生命周期很短并且会占用插槽),编写我自己的附加功能来使存储或管理器容器感知(应该是框架功能)或在我的消费类中创建容器(我显然想避免)。

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

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


主要问题:我应该如何在实践中将 Zend\Session 与容器一起使用?

附加问题:是否有充分的理由不提供类似于 ZF1 或例如类似于 Symfony SessionBag 的真正 namespace 功能?

最佳答案

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

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

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

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

关于php - Zend\Session构造函数注入(inject)如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904928/

相关文章:

architecture - ZF2 Skeleton 和 Doctrine ORM xml 模式合并

php - GAPI : Failed to request report data. 错误:“GDatainsufficientPermissionsUser 对此配置文件没有足够的权限

php - 交响乐团 3 : Undefined class constant 'AUTHENTICATION_ERROR'

PHP - 两行代码多次打印字符串

javascript - 从另一个模块注入(inject)nestjs服务

c# - Blazor (.net 7) 中的三种依赖注入(inject)语法有区别吗?

php - 如何为像 X 这样的值更改\n 值

java - Spring 自动接线

error-handling - 如何使用 ZF2 的自定义异常页面?

php - 渲染 Zend\Form\Element\Button 有内容但没有标签