получить от диспетчера сущностей до того, как будет предоставлен идентификатор

Вот ситуация -

Мне нужно сохранить объект между страницами. На первой странице я создаю объект и создаю для него форму. На второй странице я сохраняю объект. Затем у пользователя есть возможность вернуться и отредактировать свой выбор или закончить и опубликовать.

Я бы предпочел не сбрасывать мои изменения в базу данных, пока пользователь не закончит редактирование объекта. Проблема в том, что объект не получает уникальный идентификатор до тех пор, пока он не будет сброшен в базу данных.

Кто-нибудь знает, как я могу получить сохраненный, но не очищенный объект? Это вообще возможно? Есть лучший способ сделать это?


person michael    schedule 20.09.2011    source источник


Ответы (1)


Вы сериализуете объект, пока не заполните все его свойства. Вы можете удерживать сериализованный объект в сеансе, чтобы он сохранялся между страницами. Когда вы будете готовы обновить или вставить, просто десериализуйте его и поместите в базу данных.

РЕДАКТИРОВАТЬ: пример

// page 1
$object->setProperty($value);
$_SESSION['object'] = serialize($object);

// page 2
$object = unserialize($_SESSION['object']);
// use $object

$_SESSION['object'] = serialize($object);


// page N
$object = unserialize($_SESSION['object']);
$object->insertIntoDB();

РЕДАКТИРОВАТЬ 2. Не забудьте включить определение класса на все страницы, которые не сериализуют объект, иначе он не будет работать.

person Dan Bizdadea    schedule 20.09.2011
comment
сладкий. Я пытался использовать сеанс ранее, но мне не хватало части сериализации. Попробую, спасибо за совет. Если это сработает, я буду считать это своим ответом. - person michael; 20.09.2011
comment
ммм .. объект, похоже, не сериализуется через функцию php. может быть, есть функция symfony, которую мне не хватает... есть ошибка: имя купона для O:33:Frontend\UserBundle\Entity\Coupon:20:{s:5:.... это просто вызов \serialize($coupon ); 500 Внутренняя ошибка сервера — Twig_Error_Runtime - person michael; 20.09.2011
comment
k я думаю, что понял, используя use Symfony\Component\Serializer\Serializer; используйте Symfony\Component\Serializer\Encoder\JsonEncoder; используйте Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; и $serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new JsonEncoder())); $json = $serializer-›serialize($coupon, 'json'); - person michael; 20.09.2011
comment
но теперь я не могу найти способ десериализовать его обратно в объект купона ^^ - person michael; 20.09.2011
comment
$coupon = $serializer-›decode($json, 'json'); дает мне массив вместо объекта купона - person michael; 20.09.2011
comment
человек ... так что похоже, что мне придется написать скрипт, чтобы разобрать весь этот json ... действительно ли это лучший способ использовать сохранение объекта между страницами без сохранения его в базе данных? - person michael; 20.09.2011
comment
ну, я не знаю, позволит ли кодирование в json вернуть ваш объект. функция unserialize php создаст экземпляр типа объекта, который у вас был. с декодированием вы получите массив или объект stdClass. - person Dan Bizdadea; 20.09.2011
comment
какие ошибки были при сериализации? у вас есть ссылки на другие объекты? - person Dan Bizdadea; 20.09.2011