3

序列化 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. 为什么“状态”属性在序列化时消失了?
  2. 在 Phalcon 世界中,持久化模型是一种不好的做法(我认为这是在会话中存储用户对象的一种方便方式)?

我在 Phalcon 1.3.0 上。

谢谢, Temuri

4

2 回答 2

4

\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;
    }
}
于 2013-09-24T16:06:31.173 回答
0

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

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

于 2013-09-24T15:41:50.453 回答