Dziś chciałbym przestawić bibliotekę swojego autorstwa - Hormon. Jest to biblioteka typu ORM dla PHP - ma ona za zadanie być kompaktową, choć w pełki funkcjonalną biblioteką tego typu. Najważniejszą regułą w trakcie jej tworzenia jest używanie tak dużo z tego, co oferuje PDO+PHP5 jak to tylko możliwe. Z kilku powodów. Po pierwsze - to co wbudowane w binarną część PHP5, czy rozszerzenia PDO jest o wiele szybsze i wydajniejsze niż zamienniki napisane w natywnym kodzie PHP. Po drugie - kod jest dzięku temu mniejszy. W końcu po trzecie - funkcjonalność przyszłych wersji PDO/PHP5 będzie bez większych problemów dostępna i będzie wymagać mniejszego nakładu pracy. To oczywiście zgoła odmienne podejście niż to z wielu innych bibliotek, gdzie wszystko, co tylko się da, należy dodać do kodu źródłowego, ale w tym wypadku, jak już wspominałem, to nie jest porządany kierunek - rozwój Hormona jest głównie skupiony na byciu kompaktowym i transparentnym wobec używanych "niżej" warstw aplikacji.
Co to jest ORM?
Za Wikipedią: "Mapowanie obiektowo-relacyjne (ang. Object-Relational Mapping ORM) - sposób odwzorowania obiektowej architektury systemu informatycznego na bazę danych (lub inny element systemu) o relacyjnym charakterze. Implementacja takiego odwzorowania stosowana jest m.in. w przypadku, gdy tworzony system oparty jest na podejściu obiektowym, a system bazy danych operuje na relacjach.".
Innymi słowy - biblioteki ORM mapują bazy danych na środowisko języka programowania i odwrotnie. To daje możliwość korzystania z danych bazy danych SQL (zazwyczaj) w kodzie zorientowanym obiektowo bez konieczności grzebania się w samym języku SQL; troszczy się o relacje i ograniczenia; optymalizuje zapytania do wykonania, aby nie stwarzać niepotrzebnej pracy (w efekcie uniknąć niepotrzebnego obciążenia). Głównym powodem stosowania biblioteki ORM jest to, że automatyzuje wiele działań związanych z bazą danych takich jak tworzenie struktury samej bazy i kodu klas. Wiele z tych zadań jest bardzo w czasochłonnych i po prostu nudnych, gdyby je robić ręcznie - kodowanie zwykłych metod pobierania i ustawiania dla każdego pola, budowanie zapytań itp. - biblioteka ORM, taka jak Hormon, bierze dane z pliku konfiguracyjnego, który jej podajesz i generuje na jego podstawie zarówno schemat SQL jak i kod PHP wszystkiego, co chcesz mieć w swojej bazie danych.
Wynajdywanie koła po raz drugi
Jak pewnie wiesz, lub nie, istnieje już wiele podobnych bibliotek dla PHP5. Jednak tylko dwie są naprawdę warte wypróbowania - Propel i Doctrine - inne biblioteki są zwykle tylko słabymi próbami przerwanymi po krótkim czasie. Tak więc, jeśli istnieją już dwie dobre biblioteki, dlaczego stworzyłem Hormona? Na prawdę nie lubię "ponownie wynajdywać koła" (co oznacza, tworzenie czegoś, co istnieje już od dawna) - starałem się korzystać z obu z nich wiele razy. Niestety ani Propel, ani Doctrine nie podpasowały mi.
Doctrine przedstawia sposób kodowania zupełnie niż lubiany przeze mnie - zbyt wiele magii. Wszystkie te publiczne pola, które nie są polami, wszystkie te refleksje, chociaż dane są dostępne w trakcie budowy i coś, czego zupełnie nie mogę zrozumieć: DQL - jeśli tworzysz warstwę abstrakcji SQL, której chcesz używać w PHP, to chcesz aby był to kod PHP, ale w Doctrine otrzymujesz inny język, który jest uproszczonym językiem zapytań (ma być bardziej inteligentny). Ok, może to są dobre pomysły, ale nie pasowały mi.
Z drugiej strony Propel był czymś, co naprawdę polubiłem od strony interfejsu API. Ale jest wiele rzeczy, które mnie denerwowały podczas korzystania z niego. Zarówno w procesie budowania jak i wykonawczej biblioteki jest wiele rzeczy, które chciałem rozwiązać lepiej, ale po jakimś czasie zdałem sobie sprawę, że łatwiej będzie stworzyć własną bibliotekę od zera. Jak powiedziałem, sposób w jaki Propel organizuje API był dla mnie wygodny, więc od strony użytkownika (programisty) może to wyglądać nieco znajomo, ale od wewnątrz - zupełnie inaczej.
Oczywiście obecnie Hormon oferuje tylko mały kawałek funkcji dostępnych w wymienionych bibliotekach, ale będzie intensywnie rozwijany, dlatego mam nadzieję na dojrzałą i spójną bibliotekę gotową do użycia w złożonych projektach.
…albo wyjdzie, że jestem idiotą i cała ta praca będzie bezużyteczna
.
Funkcjonalność
W tej chwili Hormon zawiera podstawową funkcjonalność DBAL i ORM. Chociaż na ten moment obsługiwana jest jedynie baza danych MySQL (dodanie sterowników dla różnych RDBMSów nie powinno być problemem, ale wymagać będzie czasu). Zawiera klasy generatorów zapytań, które obsługują bindingi parametrów PDO (zarówno parametry wejściowe, jak i zwracane pola). Generator kodu obsługuje formaty YAML, XML i INI. Generuje schemat bazy danych SQL i klasy ORM. Klasy list implementują interfejs IteratorAggregate, który deleguje iterację w pętli foreach() {…} do natywnego obiektu PDOStatement (z przypisanymi obiektami). Realizuje także interfejs Countable mapujący zapytanie COUNT().
Pola mogą być zdefiniowane jako lazy (przydatne w przypadku LOBów), aby uniknąć ładowania ich domyślnie i pozostawić do leniwej inicjalizacji na żądanie. Biblioteka wspiera również typ DateTime, który moż być używany bezpośrednio w sposób obiektowy. Tak klasy rekordów, jak i list obsługuje wszystkie dane powiązane z tabel obcych - możliwe jest, na przykład, wykonanie zapytania JOIN zarówno podczas ładowania pojedynczego rekordu jak i całej listy. Hormon z łatwością obsługuje również przyłączanie wielu tabel, nawet wiele przyłączeń tej samej tabeli umożliwiając na wszystkich połączonych tabelach działania takie jak sortowanie lub filtrowanie. Wszystkie zmiany w polach są zauważane, więc na przykład podczas aktualizacji zostaną zmienione tylko zmodyfikowane pola. Także jeśli pole ma wartość domyślną nie jest zapisane przed jawną modyfikacją. Istnieje również mechanizm łatwego iterowania tabel słownikowych, dzięki czemu można wykorzystać konstrukcję foreach($table as $id => $label){…}.
Funkcjonalnośc PHP 5.3 jak domknięcia, anonimowe funkcje lub przestrzenie nazw nie są wykorzystywane, gdyż PHP 5.3 nie jest jeszcze powszechnie stosowane, ale gdy tylko stanie się standardem, Hormon będzie korzystać ze wspomnianych funkcji.
Rzeczy do zrobienia
Przede wszystkim koniecznością są sterowniki RDBMSów innych niż MySQL - głównie PostgreSQL, Oracle, MSSQL, Firebird i SQLite. Z drugiej strony, potrzebne jest wiele ważnych elementów:
- relacje NdoM,
- dziedziczenie tabel,
- tryb debugowania,
- obsługa własnych typów (własnych klas),
- lepsze wykorzystanie wyjątków,
- API walidacji,
- przebudowa procesu budowania (generator zorientowany obiektowo, możliwość zmiany katalogu głównego, manager projektów, wsparcia dla konfiguracji w formacie PHP i JSON),
- relacje 1do1,
- mechanizmy dla drzewek,
- domyślne dane w schemacie projektu,
- wiele innych pomysłów.
Ważne jest również stworzenie dodatkowych zasobów jak dokumentacja (głównie), benchmarku (w odniesieniu do Propela i Doctrine), stworzenie strony internetowej, testów jednostkowych i tak dalej.
To działa!
Czy można bezpiecznie korzystać z Hormona? Czy to naprawdę działa? Mimo że projekt został dopiero rozpoczęty, z tego co osobiście doświadczyłem, jest gotowy do użycia w projektach, w których będzie on spełniał wymagania względem warstwy DBAL/ORM. Przed udostępnieniem go używałem Hormona w mojej pracy i sprawował się świetnie! Oczywiście istniały pewne błędy na początku, ale od tamtej pory wszystko, co znalazłem zostało poprawione, dlatego powinien być bardzo stabilny. Poniżej znajduje się lista projektów, które zostały wykonane przy użyciu Hormona jako biblioteki DBAL/ORM:
- e-Property (system wymiany ofert nieruchomości)
- MaxRate (hosting gier multiplayer)
- Brabud (firma budowlana)
- KraineHerbaty (Sklep z herbatami - Hormon jest wykorzystywany przez bibliotekę konfiguratora herbat)
Jak widać sprawuje się świetnie przy prostych stronach internetowych, a także większych portalach. Używam go również go w kilku projektów, które są obecnie w fazie rozwoju i nadal działa świetnie.
Chcesz pomóc?
Hormon został stworzony całkowicie przeze mnie. Jeśli chcesz pomóc w rozwoju tego projektu, nie krępuj się - napisz do mnie, twoja pomoc będzie bardzo przydatna. Jestem zajętym człowiekiem i nie będę miał dużo czasu na pracę nad tym projektem - będzie głównie rozwijany w sposób potrzebny do moich projektów lub gdy będę miał trochę wolnego czasu. Jeśli chcesz przyczynić się do jego rozwoju w jakikolwiek sposób, napisz na wrzasq@gmail.com.
Tagi: php, skrypty, kod, teksty, orm, sql, hormon.
Aby pisać komentarze musisz być zalogowany.
Victor (wtorek, 29 wrzesień 2009 - 14:02:01)
Re: Hormon - biblioteka ORM
Zostało to opisane, lecz nadal nie rozumiem czemu to ma służyć. Zapewne jak bym szukał tego, to bym wiedział o co chodzi. Lecz czy możesz Wrzasq podać konkretny przykład zastosowania? :P
Thunderer (środa, 14 kwiecień 2010 - 13:53:19)
Re: Hormon - biblioteka ORM
Popieram powyższy komentarz - jak się tworzy nową bibliotekę to pierwsze pytania jakie powinno się zadać, to: * czy nie ma istniejącej dobrej alternatywy * w czym ma to ułatwić pracę względem tego co już jest Sam korzystam z Doctrine i nieszczególnie zauważam "lukę" w rynku", którą próbujesz zapełnić, także czekam na tutorial / przykładowy kod / chociaż "showcase". ;]