2016-05-17 6 views
2

У меня есть несколько объектов, каждый со своим типом формы. Я хочу, чтобы вместо сохранения объекта сразу сохранить, сохраните копию изменений, которые мы хотим выполнить, и сохраним их в БД. Мы отправили сообщение пользователю, который может одобрить изменение, кто рассмотрит оригинал и измененные поля и утвердит или нет. Если это одобрено, объект будет правильно очищен.Symfony2 - Doctrine2 магазин изменений для более позднего (или альтернативного решения для одобрения изменений)

Чтобы решить эту проблему, я думал о:

1) делает упорствовать

2) Получение ревизий (как один связанные с «нормальными» полями, и одна относительно коллекций)

3) хранение в DB

4) Выполнение $ em-> refresh() для отмены изменений.

Позже мне нужно вернуть чек (ы) назад, попросить (другого) пользователя одобрить его и очистить.

Является ли это выполнимым? Меня особенно беспокоит то, что диспетчер объектов, сгенерировавший первый набор изменений, не тот, который мы собираемся использовать для выполнения флеша, мне в основном нужно «загрузить» набор изменений.

Любая идея о том, как решить эту проблему (этот путь, так или иначе;))

Другое решение (работает только для «нормальных» поля, а не ссылаться на те, которые поступают от других лиц к текущей, как многие из многих) было бы клонировать текущую сущность, хранить ее, а затем после того, как разрешено копировать поле (ы) из клонированного в исходное. Но это не работает для всех полей (если предыдущее решение не работает, мы ограничили бы функцию только «нормальными» полями).

Спасибо!

SN

ответ

0

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

Так, например, если у вас есть Book s, которые хранятся в базе данных, и вы хотите, чтобы все изменения, внесенные в них, были одобрены, просто добавьте модель, которая будет содержать набор изменений, который должен быть обработан и обработчик, который будет применять эти изменения:

<?php 

class UpdateBookCommand 
{ 
    // If you'll store these commands in a database, perhaps this field would be a relation, 
    // or you could just store the ID 
    public $bookId; 

    public $newTitle; 

    public $newAuthor; 

    // Perhaps this field should be somehow protected from unauthorized changes 
    public $isApproved; 
} 

class UpdateBookHandler 
{ 
    private $bookRepository; 

    private $em; 

    public function handle(UpdateBookCommand $command) 
    { 
     if (!$command->isApproved) { 
      throw new NotAuthorizedException(); 
     } 

     $book = $this->bookRepository->find($command->bookId); 
     $book->setTitle($command->newTitle); 
     $book->setAuthor($command->newAuthor); 

     $this->em->persist($book); 
     $this->em->flush(); 
    } 
} 

Далее в контроллере вы просто должны убедиться, что команды как-то хранятся (в базе данных или, может быть, даже в очереди сообщений), а обработчик вызывается, когда изменения могут быть применены.

P.S. Возможно, я мог бы объяснить это немного лучше, но главным образом вдохновение для этого решения исходит от CQRS pattern that's explained quite well by Martin Fowler. Однако, я думаю, в вашем случае полномасштабная реализация CQRS не нужна, и более простое решение должно работать.

+0

Благодарим за отзыв! Это не применимо напрямую, поскольку у нас есть несколько объектов, и мне нужно решение общей цели, но это помогло мне задуматься. Я отправлю окончательное решение, когда придумаю один;) –