我会直接进入它。我有一个类User
需要做一些数据库操作(使用类DB
)。控制器根据需要创建DB
,并使用其构造函数将其注入User
。
当用户登录时,User
对象将存储到会话中。问题是DB
无法序列化到会话中,因此当User
醒来时,其db
成员为null
,这很糟糕。我用
public function __wakeup() { $this->db = new DB; }
..然而,这肯定违反了DI,如果DB
需要根据控制器的不同而有所不同,它甚至可能导致问题(控制器创建DB
它毕竟需要。
问题是当User
从会话中反序列化时,它不会再次构建,因此它没有机会获得数据库成员。我有几个可能的解决方案,每个问题都有:
DB
,但似乎仍然违反了DI精神。控制器还必须知道设置DB
$usr = new User($_SESSION['user-token'], new DB);
之类的操作)。另一方面,将User
对象保留在超全局变量之外会阻止一些令人讨厌的全局变量使用。有什么建议吗?
答案 0 :(得分:3)
由于您的用户对象具有DB对象的依赖关系且无法对数据库对象进行序列化,因此您的用户对象本身也无法序列化。
所以基本上你的问题是你序列化了一个不能序列化的对象。
您实际需要的是会话状态。创建一个能够选择模型(集合)并且能够提供模型(get)的会话状态对象。
通过向会话对象添加逻辑如何序列化特定对象(或者更好:存储在会话中,例如,如果它是数据库模型,通常只需要存储ID),这将像任何其他工厂一样工作。 / p>
然后将Session对象注入依赖项。