Сериализация Phalcon\Mvc\Model - теряются свойства объекта

При сериализации 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.

Спасибо, Темури.


person temuri    schedule 24.09.2013    source источник


Ответы (2)


\Phalcon\Mvc\Model реализует сериализуемый интерфейс.

Чтобы сериализовать свои собственные свойства (о которых \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;
    }
}
person Vladimir Kolesnikov    schedule 24.09.2013
comment
Пользователь Github alanbarber111 опубликовал интересный фрагмент: github.com/phalcon/cphalcon/issues/1285. - person temuri; 14.12.2014

Ответ таков: сериализатор Phalcon в настоящее время игнорирует все свойства, не относящиеся к модели, чтобы сделать сериализованные объекты легкими.

Я подал новый NFR: https://github.com/phalcon/cphalcon/issues/1285. .

person temuri    schedule 24.09.2013