我有一个 User 对象,其 protected 成员指向一个 PDO 对象。
我正在使用 Silex/Symfony,当我尝试登录时 Symfony\Component\Security\Core\Authentication\Token\AbstractToken
去序列化那个对象并给出一个异常,因为 PDO 对象不能'不被连载。
我尝试将成员设为私有(private),但这没有帮助。如果我取消设置 __sleep 中的属性,我不确定如何将它放回 __wakeup 中,因为该成员是通过在构造函数中传递来设置的。
我见过的示例通过静态查找取回不可序列化的内容,但我正在努力避免这种情况。有什么想法吗?
最佳答案
听起来你的模型对象中有持久化逻辑,这是你问题的真正根源;您可能想看看存储库设计模式来解决这个问题。
与此同时,重新填充 PDO 对象的唯一真正选择是使用邪恶的全局变量;你的 __wakeup() 必须伸出手去捕获一个实例。
我想您也可以覆盖加载用户的服务,并将其替换为在反序列化后立即注入(inject)数据库的服务,但这似乎有点麻烦——最好只是从模型中提取持久性代码并只序列化模型。
关于PHP:如何防止序列化命中某个成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30471341/