Доктрина 1.2: события с устаревшими инициаторами вызывают проблемы с версионным поведением

У меня есть ощущение, что я могу что-то упустить здесь, но я все равно иду.

Подумайте об этом: у меня есть класс «Бронирование», в котором есть поле user_id и поведение с возможностью версии, и я запускаю следующий код:

$booking = new Booking();

$booking->user_id = 1;

$booking->isValid();

$booking->user_id = 2;

$booking->save();

Это приводит к тому, что в таблицу «бронирования» вставляется правильная запись. НО запись, вставленная в таблицу «booking_version», устарела! Для user_id установлено значение 1, поскольку данные извлекаются из инициатора событий, созданного во время первого вызова isValid(). Кроме того, поле id установлено на 0 по той же причине (что означает, что запись версии не может быть связана обратно с бронированием).

Я могу обойти эту проблему, вызвав $booking->clearInvokedSaveHooks() перед save(), но я действительно не хочу этого делать, потому что я не хочу снова запускать все свои сохранения при сохранении.

Есть ли лучший способ обойти это?


person Nada_Surf    schedule 20.07.2011    source источник


Ответы (1)


Здесь нет ничего обходного пути. Versionable поведение предназначено для хранения < strong>предыдущие значения записи.

Если вы хотите сохранить каждое временное состояние объекта, вам придется save каждый раз его save хранить.

person J0HN    schedule 26.08.2011
comment
На самом деле я не хочу хранить каждое временное состояние. Я хочу, чтобы BookingVersion сохранял «окончательное» состояние Booking, когда я вызываю save(), независимо от того, как были изменены значения Booking с момента его создания. К сожалению, похоже, что когда я изменяю конкретную переменную в бронировании более одного раза между ее созданием и сохранением, поведение версии нарушается. - person Nada_Surf; 28.08.2011
comment
Что вы подразумеваете под final состоянием? Если вы хотите, чтобы ваши изменения были дискредитированы - просто не сохраняйте их. Если вы хотите, чтобы все ваши изменения сохранялись только в одной записи, просто сохраните объект, это поведение по умолчанию. Если вам нужна только одна копия вашего объекта в booking_version... Зачем вам это нужно? Итак, ваше намерение немного неясно, не могли бы вы пояснить его? - person J0HN; 29.08.2011