BLOG

File archive


Mimo, iż nasza strona funkcjonuje już od jakiegoś czasu, dopiero teraz udało nam się przystąpić do napisania pierwszego wpisu na blogu. Chcielibyśmy prowadzić go regularnie, więc na dobry początek podzielimy się z Wami opisem architektury naszego projektu open source’owym projekcie “FileArchive“, który mieliśmy okazje współtworzyć w czasie PHPackaton 2014.

Głównym założeniem projektu było wykazanie, że frameworki, system dostarczania oraz warstwa zapisu danych są tylko detalami, o których powinniśmy zacząć myśleć dużo później niż robi to obecnie wiekszość z nas. Podejście takie nazywane jest architekturą Hexagonalną lub Clean Architecture. Jednoczesnie staraliśmy się stworzyć FileArchive stosując metodologię BDD. Aplikacja “FileArchive” ma służyć do archiwizowania plików (np. zdjęć z eventów phpers). Generuje ona archiwa, które następnie mogą być wysyłane do roznych serwisow (np. lokalny system plików serwera, (s)ftp, amazon storage, bit torrent sync).

Główne repozytorium – FileArchive

Główne repozytorium zawiera:

  1. Dwie warstwy testów (automatycznych specyfikacji)
  2. UseCase’y – moduły reprezentujące przypadki użycia
  3. Model – interfejsy reprezentujące abstrakcję systemu
  4. Konkretne implementacje modelu

Ad. 1 Logika sprawdzana jest przez dwie warstwy testów (automatycznych specyfikacji):

Ad. 2 Use cases: Katalog “UseCase” zawiera przypadki użycia aplikacji. Każdy z nich jest reprezentowany jest przez osobną klasę. Zaimplementowaliśmy: * tworzenie archiwum * wyświetlanie istniających archiwów * wysyłanie danego archiwum w chmurę

W warstwie “UseCases” znajdują się również obiekty DTO (Data Transfer Object) służące do transferu (wysyłania, odbierania) danych z mechanizmem dostarczania (Behat, ConsoleCommand, Web).

Ad. 3

W aplikacji wyróżniliśmy trzy abstrakcyjne moduły:

  • źródło z którego powstanie archiwum  - FileSource
  • archiwum w którym będą zapisane nasze pliki  - Archive
  • adaptery które będą obsługiwać różne rodzaje chmur  - UploadProvider

Ad. 4

Dwie konkretne implementacje modułów:

Drugie repozytorium – aplikacja Symfony2.

Repozytorium projektu Symfony2 składa się z 3 bundli oraz adaptera do biblioteki Doctrine:

  1. CoreBundle służy do rejestracji wszystkich potrzebnych klas aplikacji.
  2. ConsoleCommandBundle zależny od Core, dostarcza aplikację w linii komend.
  3. WebBundle zależny od Core, dostarcza aplikację w Webie.
  4. DoctrineAdapter integruje bibliotekę Doctrine z projektem i pozwala na zapis archiwów do bazy danych.

Schemat architerktury

architecture

Zalety architektury

  • Niezależność aplikacji od sposobu jej dostarczenia (Web, Console, Behat):: webconsole
  • Bardzo szybkie testy: fast-behat
  • Przejrzystość funkcjonalności: use-cases
  • Niezależność od mechanizmu zapisu – Doctrine lub InMemory
  • Modułowa/Pluginowa architektura

Proces

Tworzenie “FileArchive” rozpoczęliśmy od napisania specyfikacji UseCase’ów w Behacie (pliki .feature). Następnie poprzez zaliczanie kolejnych scenariuszy zaplanowaliśmy architekturę i stworzyliśmy jej najprostszą implementację (moduły InMemory). Po uzyskaniu działających UseCase’ów zajęliśmy się tworzeniem konkretnego modułu adaptera do biblioteki Gaufrette. Ostatnim krokiem było stworzenie aplikacji w framework’u Symfony2 i dostarczenie jej interfejsu przez konsolę. Ponadto używając Doctrine w łatwy sposób zintegrowaliśmy zapisywanie archiwów w bazie danych.

Podsumowanie

Mamy nadzieję, że udało nam się pokazać w jaki sposób staramy się tworzyć aplikacje. Najważniejsze jest myślenie o aspektach biznesowych projektu, a wybór bazy danych czy framework’a da się odłożyć w czasie.