W kilku projektach, z którymi miałem styczność, napotkałem problem wersjonowania danych w bazie danych. Problemem było takie przygotowanie bazy danych i aplikacji, aby w łatwy sposób zapisywać i pobierać historię zmian w konkretnej tabeli (tabelach). Powstało kilka wersji mechanizmu archiwizującego dane, ale żaden z nich nie był w pełni satysfakcjonujący a jego powstanie obarczone było dużą ilością kompromisów. Zacząłem rozglądać się za gotowym rozwiązaniem, niestety nie znalazłem nic, co by mi odpowiadało, więc wziąłem się do pracy i stworzyłem bibliotekę, która automatycznie archiwizuje dane.

Obecnie pracuję głównie na Laravelu, więc naturalną koleją rzeczy jest, że biblioteka została napisania pod tego frameworka. Zanim przejdę do jej opisu, muszę wyraźnie zaznaczyć, że w chwili obecnej nie nadaje się ona do używania w produkcyjnym środowisku.

Instalacja

Do zainstalowania biblioteki będziemy potrzebować composera

composer require wilgucki/dbrepository @dev

Po zakończeniu instalacji, musimy dodać w pliku config/app.php ServiceProvidera

'providers' => [
    //...
    Wilgucki\DbRepository\DbRepositoryServiceProvider::class,
]

a następnie zarejestrować słuchacza (app/Providers/EventServiceProvider.php)

protected $subscribe = [
    //...
    'Wilgucki\DbRepository\Listener\DbRepositoryListener'
];

Na koniec publikujemy plik konfiguracyjny paczki przy użyciu polecenia

php artisan vendor:publish

Korzystanie z biblioteki

Zanim zaczniemy korzystać z biblioteki, musimy wskazać które modele będą obserwowane i archiwizowane. Aby to zrobić wystarczy w pliku konfiguracyjnym dbrepository.php dodać pełną nazwę klasy

'listen' => [
    //...
    'App\User',
]

oraz wykonać komendę

php artisan dbrepository:createtables

Komenda ta na podstawie modeli wymienionych w pliku konfiguracyjnym, utworzy tabele w bazie danych o nazwach odpowiadających bazowym tabelom z sufiksem _repository.

Biblioteka została tak przygotowana, aby przechwytywać zdarzenia saving na każdym zarejestrowanym modelu i zapisywać dane do odpowiedniej tabeli, dodając unikatowy identyfikator oraz datę utworzenia.

TODO

Jak już pisałem, jest to pierwsza publiczna wersja biblioteki i wymaga jeszcze ona wielu szlifów. Na chwilę obecną w planach są testy i dokumentacja oraz wykrywanie rodzaju kolumny w bazowej tabeli. Do tego jest jeszcze kilka niedoprecyzowanych pomysłów, które jak tylko się wyklarują, trafią do road map. Z chęcią wysłucham Waszych uwag oraz propozycji.