2013-05-22 13 views
5

Tworzę moduł , który wprowadzę do większego systemu; i utworzyłem tabelę do przechowywania zapisów szlaku, jako "auditora", co chcę zobaczyć aktualnie zalogowanego użytkownika, stronę, na której on/ona jest, jakie działania on/ona zrobiła i jakie były zmiany i kiedy ...Wykrywanie zmian w modelu; php yii framework

są to w zasadzie to, co chcę zobaczyć; moja tabela śladów kontroli wygląda następująco:

Użytkownik | Znacznik czasu | Nazwa modułu | Działanie | Stara wartość | Nowa wartość | Opis

I w zasadzie nie ma problemu z dostaniem się z użytkownikiem za

Yii::app()->session['username']; 

strona/modułu i działań poprzez uzyskanie sterownika:

$this->module->getName(); 
$this->action->id; 

Mój problem polega ze zmianami stara wartość do nowej wartości, zmiany wprowadzone przez użytkownika. Mogę "węszyć", co edytuje/zmienia on/ona zrobił, dosłownie kopiując zmienne i przekazując je przez moją funkcję, gdzie tworzę dziennik. Jak to zrobić dynamicznie?

W pewnym sensie chcę wykryć, czy pewne właściwości lub atrybuty danego modelu zostały zmienione i zobaczyć, jakie zmiany zostały wprowadzone, aby uzyskać szczegółowy dziennik ... Dzięki! przepraszam, naprawdę staram się to wyjaśnić.

Odpowiedz

8

W każdym modelu, który chcesz obserwować, możesz napisać metodę afterFind(), w której można przechowywać bieżące atrybuty DB w pewnej zmiennej prywatnej, e.b. _dbValues. Następnie w beforeSave() weryfikujesz aktualne atrybuty z atrybutami w _dbValues i tworzysz rekord audytu, jeśli nastąpiła zmiana.

Po wykonaniu tych czynności można zrobić krok dalej i utworzyć z niego behavior. Można tam umieścić zmienną prywatną, afterFind() i . Następnie możesz dołączyć to zachowanie do wielu rekordów.

+0

'afterFind' będzie oceniane po każdym znalezieniu, podobnie jak w siatce, prawda? Być może scenariusze mogą być używane do przechowywania atrybutów do '_dbValues' tylko przy aktualizacji. –

+0

Dziękujemy!to jest przydatne: D – muffin

6

Krótki przykład:

+0

Dzięki ... spróbuję tego – muffin

0

Twoje rozwiązanie jest dobre, ale co, jeśli nie jesteś 2 wątki, które wymagają -> save() w tym samym czasie?

Załóżmy, że:

  1. 1st wątek rekord odnaleźć, zachować status.
  2. Drugi wątek znajdź rekord, zapisz status A.
  3. następnie rekord zmiany pierwszej nitki na B, wywołanie -> save(). System zarejestruje A-> B
  4. następnie rekord zmiany drugiej nici na C, wywołanie -> save(). System zarejestruje A-> C

podsumowanie, istnieją 2 log: A-> B, A-> C. Jeśli to nie jest dla ciebie problem, po prostu zignoruj ​​go i wykonaj powyższe rozwiązanie.

Powiązane problemy