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:
class User extends BaseUser { private $log = null; //klasa przechowująca zmienione dane public function preSave(Doctrine_Event $event) { $this->log = new GiodoEvent(); $user = $event->getInvoker(); $this->log->user_id = $this->id; $this->log->old_name = $this->name; $this->log->save(); } public function postSave(Doctrine_Event $event) { $this->log->new_name = $this->name; $this->log->save(); $this->log = null; } }
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

Trzeba sobie pobrać:
$event->getInvoker()->getModified(true);
i mamy tablicę z poprzednimi wartościami zmodyfikowanych pól.