Есть ли в symfony встроенный метод сравнения испорченных значений с оригиналом? - PullRequest
6 голосов
/ 12 апреля 2011

Я использую Symfony 1.4 с Doctrine.Я построил форму, которая использует таблицу, которая имеет поведение Versionable.Как и ожидалось, Versionable создает новую версию строки каждый раз, когда форма отправляется и сохраняется.Моя проблема состоит в том, что я хотел бы предотвратить это, если фактические значения не отличаются от исходных значений, введенных в форму с помощью действия редактирования.

Я знаю, что могу сделать это с помощью JavaScript относительнобез труда.Мне просто любопытно, есть ли у Symfony или Doctrine такая функциональность, и как она используется, если да.Кажется, что у symfony есть метод, который можно проверить прямо перед вызовом $form->save().Я сплю или, возможно, упускаю что-то очевидное?

Ответы [ 3 ]

1 голос
/ 16 октября 2012

Вы можете использовать функцию DoctrineRecord::getModified(), которая возвращает массив измененных полей и связанных значений из переопределенной функции save() или в прослушивателе (preSave было бы лучшим, я думаю).
Если новые значения не отличаются, вы можете пропустить фактический вызов save(), поэтому новая версия не создается.

1 голос
/ 12 апреля 2011

Комментарий для метода save() в Doctrine_Record:

/**
 * applies the changes made to this object into database
 * this method is smart enough to know if any changes are made
 * and whether to use INSERT or UPDATE statement
 *
 * this method also saves the related components
 *
 * @param Doctrine_Connection $conn     optional connection parameter
 * @throws Exception                    if record is not valid and validation is active
 * @return void
 */

Итак, сначала вы должны проверить, не работает ли он уже. Если нет, то Doctrine_Record имеет метод isModified (), который вы можете использовать. Если метод bind() объекта формы изменяет объект в форме, которая сначала должна содержать значения по умолчанию, то этот метод должен возвращать значение true.

0 голосов
/ 16 ноября 2015

Если вы не хотите переопределять метод save() или реализовывать прослушиватель, как подсказывает джодет, вы можете вместо этого остаться с привязкой к форме:

$form->bind($values);
if ($form->isValid()) {
    $form->updateObject();
    $changes = $form->getObject()->getModified();

    // save to database if desired
    $form->save();
}

Объект не будет сохранен в базе данных при вызове $form->updateObject(), но фактический объект php изменяется.
Также обратите внимание, что вам, возможно, придется вызывать getModified() для каждого связанного объекта, если у вас есть встроенные подчиненные формы.

...