PHP:如何防止序列化命中某个成员

时间:2015-05-27 00:46:18

标签: php symfony silex

我有一个User对象,其受保护成员会导致PDO对象。

我正在使用Silex / Symfony,当我尝试登录Symfony\Component\Security\Core\Authentication\Token\AbstractToken时,会序列化该对象并提供异常,因为PDO对象无法序列化。

我尝试将该成员设为私有,但这并没有帮助。如果我在__sleep中取消设置属性,我不知道怎么把它放回到__wakeup中,因为成员是通过在构造函数中传递来设置的。

我见过的例子通过静态查找得到了不可序列化的东西,但我试图避免这种情况。有什么想法吗?

3 个答案:

答案 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包,它允许你在你的实体中进行注释,准确选择你想要序列化的属性/方法(或不是)。

检查出来: http://jmsyst.com/bundles/JMSSerializerBundle#usage