【问题标题】:PHP: How to prevent serialize from hitting a certain memberPHP:如何防止序列化命中某个成员
【发布时间】:2023-04-07 00:48:01
【问题描述】:

我有一个用户对象,其受保护的成员指向一个 PDO 对象。

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

我尝试将成员设为私有,但没有帮助。如果我在 __sleep 中取消设置属性,我不确定如何将其放回 __wakeup 中,因为该成员是通过在构造函数中传递来设置的。

我见过的示例通过静态查找返回不可序列化的内容,但我试图避免这种情况。有什么想法吗?

【问题讨论】:

    标签: php symfony silex


    【解决方案1】:

    听起来您的模型对象中包含持久性逻辑,这是您问题的真正根源;你可能想看看存储库设计模式来解决这个问题。

    与此同时,重新填充该 PDO 对象的唯一真正选择是使用邪恶的全局变量;你的 __wakeup() 必须伸出手去抓一个实例。

    我想您也可以覆盖加载用户的服务并将其替换为在反序列化后立即注入数据库的服务,但这似乎有点麻烦——最好只是从模型中提取持久性代码并仅序列化型号。

    【讨论】:

    • 我有一个进行查询的对象和一个包含数据的对象。我正在返回包含数据的对象,但也有对对象管理器的引用,因此它可以从其他实体中检索数据。我可能只是把它换掉更好。
    • 在那张纸条上,我要赞成你的答案,但选择@Leggendario's 作为答案,因为这在技术上回答了这个问题,这个答案有助于我愚蠢的实施细节
    【解决方案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 的答案。

    【讨论】:

    • 出于某种原因,如果我从实现的serialize 中执行return serialize($this); 作为测试,即使PDO 位在那里,它也不会爆炸,它只是序列化为string(4) "r:3;" .我必须错过一些东西。
    • 我编辑了一个例子。但是,这仅允许您将问题扫到地毯下。问题出在其他地方。查看 Bryan Agee 的答案
    【解决方案3】:

    一个小补充:JMS Serializer 是一个很酷的 symfony 捆绑包,它允许您在实体中进行注释,精确选择您想要序列化(或不序列化)的属性/方法。

    检查一下: http://jmsyst.com/bundles/JMSSerializerBundle#usage

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多