【问题标题】:Phalcon\Mvc\Model serialization - object properties are lostPhalcon\Mvc\Model 序列化 - 对象属性丢失
【发布时间】:2013-09-24 14:52:09
【问题描述】:

序列化 Phalcon\Mvc\Model 会丢失不属于架构的对象属性。

我有以下模型,它在加载时设置状态数组:

class Country extends Phalcon\Mvc\Model
{
    protected $states;

    public function initialize()
    {
        $this->setSource('countries');
    }

    public function afterFetch()
    {
        if ($this->id) {
            $this->states = ['AL', 'AZ', 'NV', 'NY'];
        }
    }
}

我这样做:

    $country = Country::findFirst($countryId);
    $serialized = serialize($country);
    $unserialized = unserialize($serialized);

$serialized 字符串甚至不包含“状态”子字符串。因此,未序列化的对象中缺少“状态”。

我在处理会话中的用户身份验证和持久性(涉及序列化/反序列化)时发现了这一点。我的 User 对象丢失了在 afterFetch() 阶段加载的所有属性。

两个问题:

  1. 为什么“states”属性在序列化时消失了?
  2. 在 Phalcon 世界中,持久化模型是一种不好的做法(我认为这是在会话中存储用户对象的一种便捷方式)?

我在 Phalcon 1.3.0 上。

谢谢, 手鞠

【问题讨论】:

    标签: php phalcon


    【解决方案1】:

    \Phalcon\Mvc\Model 实现 Serializable 接口。

    要序列化您自己的属性(\Phalcon\Mvc\Model 不知道),您需要使用这样的技巧:http://ua1.php.net/manual/en/class.serializable.php#107194

    public function serialize()
    {
        $data = array(
            'states' => $this->states,
            'parent' => parent::serialize(),
        );
    
        return serialize($data);
    }
    
    public function unserialize($str)
    {
        $data = unserialize($str);
        parent::unserialize($data['parent']);
        unset($data['parent']);
        foreach ($data as $key => $value) {
            $this->$key = $value;
        }
    }
    

    【讨论】:

    • Github 用户 alanbarber111 发布了一个有趣的 sn-p:github.com/phalcon/cphalcon/issues/1285
    【解决方案2】:

    答案是 - Phalcon 序列化程序目前忽略所有非模型属性,以使序列化对象更轻。

    我已经提交了新的 NFR:https://github.com/phalcon/cphalcon/issues/1285

    【讨论】:

      猜你喜欢
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多