我有一个User对象,其受保护成员会导致PDO对象。
我正在使用Silex / Symfony,当我尝试登录Symfony\Component\Security\Core\Authentication\Token\AbstractToken
时,会序列化该对象并提供异常,因为PDO对象无法序列化。
我尝试将该成员设为私有,但这并没有帮助。如果我在__sleep中取消设置属性,我不知道怎么把它放回到__wakeup中,因为成员是通过在构造函数中传递来设置的。
我见过的例子通过静态查找得到了不可序列化的东西,但我试图避免这种情况。有什么想法吗?
答案 0 :(得分:4)
听起来你的模型对象中有持久性逻辑,这是你问题的真正根源;您可能需要查看存储库设计模式以便将其整理出来。
同时,重新填充PDO对象的唯一真正选择是使用邪恶的全局变量;你的__wakeup()必须伸手去拿一个咒语。
我想你也可以覆盖加载User的服务,并将其替换为在反序列化后立即注入数据库的服务,但这似乎有点毛茸茸 - 最好只是从模型中提取持久性代码并仅序列化模型。
答案 1 :(得分:2)
您需要对用户对象实施Serializable
。
class User implements UserInterface, Serializable
{
// ...
public function serialize()
{
// see http://php.net/manual/en/serializable.serialize.php
return serialize(array(
$this->id,
$this->username,
$this->password
));
}
public function unserialize($serialized)
{
// see http://php.net/manual/en/serializable.unserialize.php
list ($this->id, $this->username, $this->password) = unserialize($serialized);
}
}
<强> 修改 强>
警告:这只回答“如何阻止序列化命中某个成员”的问题。如果你发现自己有类似的问题,那么你应该重新考虑你在做什么。有关详细信息,请参阅@Bryan Agee的答案。
答案 2 :(得分:0)
一个小小的补充:JMS Serializer是一个很酷的symfony包,它允许你在你的实体中进行注释,准确选择你想要序列化的属性/方法(或不是)。