Witam,

Potrzebuję logować wszelkie zmiany danych użytkowników.
Chciałem to zrobić automatycznie przy każdym zapisie do tabeli userów.

Dopisałem więc metody preSave oraz postSave, mniej więcej tak:

  1. class User extends BaseUser {
  2.  
  3. private $log = null; //klasa przechowująca zmienione dane
  4.  
  5. public function preSave(Doctrine_Event $event) {
  6.  
  7. $this->log = new GiodoEvent();
  8.  
  9. $user = $event->getInvoker();
  10.  
  11. $this->log->user_id = $this->id;
  12. $this->log->old_name = $this->name;
  13.  
  14. $this->log->save();
  15.  
  16. }
  17.  
  18. public function postSave(Doctrine_Event $event) {
  19.  
  20. $this->log->new_name = $this->name;
  21.  
  22. $this->log->save();
  23.  
  24. $this->log = null;
  25.  
  26. }
  27.  
  28. }


I to generalnie działa... ale obydwa pola mają taką samą wartość - już tą po zapisaniu. A fajnie byłoby jednak żeby dostać wartość pola 'name' PRZED zapisaniem rekordu (zgodnie zresztą z nazwą metody).
Kombinowałem też z preUpdate/postUpdate a także ze stworzeniem osobnej klasy potomnej do Doctrine_Listener i podłączać ją do klasy User (w metodzie setUp()) lub do całego obiektu połączenia.
Za każdym razem jeśli działa to zapisuje nowe wartości pól :/

Zrobię to w końcu po prostu w kontrolerze, ale ciekawi mnie jak to zrobić w Doctrine.

Heh, już znalazłem, niech będzie dla potomnych winksmiley.jpg

Trzeba sobie pobrać:

  1. $event->getInvoker()->getModified(true);


i mamy tablicę z poprzednimi wartościami zmodyfikowanych pól.