Autor | Doctrine Project Team |
---|---|
Pierwsze wydanie | 1.0.0 - (dts) | 1 września 2008
Aktualna wersja stabilna | 3.3.0 (13 października 2024) [±] |
Platforma sprzętowa | wieloplatformowa |
Rodzaj | Framework ORM / zestaw bibliotek do obsługi baz danych |
Licencja | MIT |
Strona internetowa |
Doctrine – rodzina bibliotek dla PHP do kompleksowej obsługi komunikacji z bazami danych. W skład Doctrine 2.0 wchodzą:
Wcześniejsze wydania oznaczone numerami 1.x były pojedynczą biblioteką ORM ze zintegrowanym narzędziem do migracji oraz warstwą abstrakcji bazy danych.
Projekt został zainicjowany przez Konsta Vesterinena, znanego także jako zYne-. Pierwsza rewizja w repozytorium SVN pochodzi z 13 kwietnia 2006 roku. Wokół projektu skupiła się aktywna społeczność rozwijająca go, zaś projekt uczestniczył m.in. w inicjatywach Google Summer of Code. Doctrine 1.0.0 został wydany 1 września 2008 roku.
21 grudnia 2010 roku ukazał się Doctrine 2.0.0, który został napisany od nowa z powodu zmiany wielu fundamentalnych założeń projektowych. Począwszy od tego wydania biblioteka wymaga do pracy przynajmniej PHP 5.3 z powodu wykorzystania wprowadzonych w tej wersji przestrzeni nazw i funkcji anonimowych, a także systemu cache pamięci współdzielonej (np. APC, Memcached) z powodów wydajnościowych.
Począwszy od wersji 2.0 Doctrine jest rodziną mniejszych, bardziej wyspecjalizowanych bibliotek. Autorzy odeszli tym samym od modelu jednej, monolitycznej biblioteki zajmującej się wszystkimi aspektami komunikacji z bazą.
Doctrine 1.x reprezentuje tabele relacyjnych baz danych w postaci klas modeli oraz udostępnia interfejs do zarządzania danymi za ich pomocą. W przeciwieństwie do innych rozwiązań tego typu, biblioteka potrafi wygenerować modele na podstawie już istniejącej struktury bazy danych, dzięki czemu nie jest konieczne zarządzanie rozbudowanymi schematami w formacie XML. Wygenerowane modele można rozbudowywać o dodatkową funkcjonalność, jakiej potrzebuje programista. Możliwa jest także praca ze schematem w formacie YAML, który służy do generowania zarówno modeli, jak i struktury bazy danych.
Jedną z kluczowych opcji biblioteki jest autorski, obiektowy dialekt SQL-a o nazwie DQL (Doctrine Query Language), inspirowany HQL-em z Hibernate'a. Zapytania można formułować także przy pomocy metod klasy Doctrine_Query
. Ponieważ DQL operuje na modelach, jest elastyczną alternatywą dla SQL-a, ukrywającą część ich logiki i bardziej przenośną między różnymi systemami baz danych.
Wśród innych możliwości biblioteki znajdują się:
Doctrine 2.0 składa się z szeregu mniejszych bibliotek odpowiedzialnych za różne aspekty pracy z bazami danych. Podstawową biblioteką jest Doctrine DBAL stanowiąca warstwę abstrakcji bazy danych. Rozszerza ona PHP Data Objects o dodatkowe funkcjonalności oraz wprowadza tzw. mechanizm platform, które opisują możliwości i różnice między dialektami języka SQL używanymi przez różne systemy zarządzania bazą danych. Na bazie DBAL zbudowana jest biblioteka ORM. W stosunku do poprzednich wydań, jej architektura oraz używana terminologia uległa całkowitej przebudowie. Obiekty reprezentujące wiersze bazy danych nie są już nazywane modelami, lecz encjami. Klasa encji może być dowolną klasą; biblioteka nie narzuca tutaj żadnych klas bazowych koniecznych do rozszerzenia czy interfejsów – pola opisywane są poprzez mechanizm adnotacji. Porzucono także wykorzystywanie elementów magicznych języka PHP na rzecz menedżera encji (entity manager), który zarządza obiektami encji w sposób jawny.
Możliwości:
Zupełnie nowymi bibliotekami są Doctrine MongoDB Document Object Mapper, który dostarcza analogiczną do Doctrine ORM funkcjonalność dla nierelacyjnej bazy danych MongoDB, oraz Doctrine Migrations do wersjonowania schematu bazy danych i jego aktualizacji.
Doctrine 1.x wymagał przynajmniej PHP 5.2.3. Doctrine 2.0 wymagał co najmniej PHP 5.3.0, od wersji Doctrine 2.2 wymagane jest PHP 5.3.2, natomiast najnowsza wersja Doctrine 2.5 wymaga przynajmniej PHP 5.4. Dodatkowo zalecane jest posiadanie mechanizmu buforowania wykorzystującego pamięć współdzieloną (np. APC, Memcached).
Doctrine 1.x wykorzystywał wzorzec active record do operowania na danych. Klasa modelu odpowiada w nim pojedynczej tabeli, a obiekt takiej klasy - pojedynczemu wierszowi w bazie danych. Przykładowo, aby utworzyć nowy wiersz w tabeli User
, wystarczy utworzyć odpowiedni obiekt i wypełnić go danymi:
// Utwórz obiekt reprezentujący nowy wiersz
$user = new User();
// Wypełnij obiekt danymi
$user->setName("Kowalski");
$user->setPassword("haslo");
// Zapisz wiersz do bazy danych
$user->save();
echo 'Użytkownik o identyfikatorze '.$user->getId().' został zapisany.';
Doctrine 2.x operuje na encjach które reprezentowane są przez lekkie obiekty. Pobieranie i zapisywanie encji w bazie danych odbywa się przy pomocy menedżera encji (entity manager) który jest implementacją wzorca mapowania danych.
// Utwórz obiekt reprezentujący nowy wiersz
$user = new User();
// Wypełnij obiekt danymi
$user->setName("Kowalski");
$user->setPassword("haslo");
// Powiadom Doctrine aby “zarządzała” obiektem $user.
$entityManager->persist($user);
// Zapisz wiersz do bazy danych
$entityManager->flush();
echo 'Użytkownik o identyfikatorze '.$user->getId().' został zapisany.';
Doctrine na bieżąco kontroluje stan obiektu i wie, czy zawarte w nim dane muszą być dodane jako nowy wiersz, czy też reprezentują one już istniejący byt i należy je tylko zaktualizować. Ponadto, logika związana z funkcjonowaniem danego modelu w projekcie może być zaprogramowana w nim samym, zamiast być rozrzucona po całej aplikacji. Ułatwia to zarządzanie dużymi projektami.