fzBlameable
Podczas pierwszego kontaktu z symfony i doctrine, nie zdawałem sobie sprawy z ułatwień oferowanych przez behavioury. Sluggable był z początku swego rodzaju magią, a ja lubię wiedzieć, jakie kółka zębate wprawiają machinę w ruch. Kwiestię właściciela, który stworzył dany obiekt, rozwiązywałem tam, gdzie obiekt był tworzony, w każdej akcji osobno.
Ale z czasem, behavioury przestały być tajemnicze, a oferowane możliwości znacznie ułatwiały tworzenie aplikacji. Blameable jest behaviourem, który w prosty sposób załatwia sprawę właściciela obiektu, a także osoby aktualizującej ten obiekt:
Dodaje pola - klucze obce;
Relację do modelu użytkownika;
Ustawia momencie tworzenia i aktualizacji ustawia odpowiednie wartości pól właściciela/soby aktualizującej.
Rozwiązanie zaproponowane przez Blameable jest uniwersalne, i dlatego użycie go w symfony, nie jest możliwe natychmiast po instalacji bibliotek. Wymaga zmiany Listenera (przykład), oraz szeregu ustawień w definicji behavioura dla modelu.
Używając oryginalnego behavioura (modyfikacji dla diem również), można zauważyć jeden mankament: brak jest aliasu zwrotnego z obiektu użytkownika, do obiektu tworzonego. Głównie z tego powodu zdecydowałem się stworzyć modyfikację Blameable dla symfony i sfDoctrineGuard. Dodane fragmenty kodu są nieznaczną modyfikacją:
Doctrine_Core::getTable( 'sfGuardUser' )->bind( array($className.' as Created'.$className.'s', array( 'class' => $className, 'local' => $this->_options['relations']['created']['foreign'], 'foreign' => $this->_options['columns']['created']['name'] )), Doctrine_Relation::MANY );
Ale jakże ułatwią tworzenie zapytań pobierających obiekty stworzone przez użytkownika. Zwykłe pobieranie wszystkich obiektów stworzonych przez użytkownika może być karkołomne, ale dla podzapytań taki alias jest idealny.
Domyślnie fzBlameable 1.0.0 współdziała domyślnie z sfDoctrineGuard 4.x, ale do użycia go w sfDoctrineGuard 5.x wystarczy zmienić typy pól created i updated:
MyModel: actAs: fzBlameable: columns: created: length: 8 updated: length: 8