依赖注入和序列化类

时间:2012-01-12 16:40:11

标签: php dependency-injection

我会直接进入它。我有一个类User需要做一些数据库操作(使用类DB)。控制器根据需要创建DB,并使用其构造函数将其注入User

当用户登录时,User对象将存储到会话中。问题是DB无法序列化到会话中,因此当User醒来时,其db成员为null,这很糟糕。我用

简单地解决了这个问题
public function __wakeup() { $this->db = new DB; }

..然而,这肯定违反了DI,如果DB需要根据控制器的不同而有所不同,它甚至可能导致问题(控制器创建DB它毕竟需要。

问题是当User从会话中反序列化时,它不会再次构建,因此它没有机会获得数据库成员。我有几个可能的解决方案,每个问题都有:

  • 允许通过setter注入设置DB
    • 这似乎也不是一个很好的解决方案。它还可以在不适当的时间设置DB,但似乎仍然违反了DI精神。控制器还必须知道设置DB
  • 不要序列化对象,而是序列化标记并每次重新创建对象
    • 这样不方便,效率低下。这也可能导致一些重复(每个控制器都需要执行$usr = new User($_SESSION['user-token'], new DB);之类的操作)。另一方面,将User对象保留在超全局变量之外会阻止一些令人讨厌的全局变量使用。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

由于您的用户对象具有DB对象的依赖关系且无法对数据库对象进行序列化,因此您的用户对象本身也无法序列化。

所以基本上你的问题是你序列化了一个不能序列化的对象。

您实际需要的是会话状态。创建一个能够选择模型(集合)并且能够提供模型(get)的会话状态对象。

通过向会话对象添加逻辑如何序列化特定对象(或者更好:存储在会话中,例如,如果它是数据库模型,通常只需要存储ID),这将像任何其他工厂一样工作。 / p>

然后将Session对象注入依赖项。