Doctrine

Doctrine
Autor Doctrine Project Team
Pierwsze wydanie 1.0.0 - 2008-09-01T00:00:00.001 1 września 2008(dts)
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ą:

  • Doctrine DBAL – warstwa abstrakcji bazy danych oparta na PHP Data Objects,
  • Doctrine ORMbiblioteka ORM,
  • Doctrine MongoDB – biblioteka do obsługi nierelacyjnej bazy danych MongoDB,
  • Doctrine Migrations - narzędzie do migracji baz danych.

Wcześniejsze wydania oznaczone numerami 1.x były pojedynczą biblioteką ORM ze zintegrowanym narzędziem do migracji oraz warstwą abstrakcji bazy danych.

Historia

[edytuj | edytuj kod]

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.

Możliwości

[edytuj | edytuj kod]

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ą.

Wersje 1.x

[edytuj | edytuj kod]

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ę:

  1. Wsparcie dla przechowywania struktur drzewiastych w bazie danych.
  2. Obsługa hooks (metod sprawdzających poprawność oraz filtrujących dane) i zdarzeń ułatwiająca wyrażenie dodatkowej logiki biznesowej.
  3. Wsparcie dla transakcji
  4. Mechanizm Cache
  5. Współdzielone zachowania (ang. behaviors), które mogą być wykorzystywane przez modele.
  6. Wsparcie dla migracji baz danych (aktualizacji struktury).

Wersje 2.x

[edytuj | edytuj kod]

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:

  1. język Doctrine Query Language do formułowania zapytań z jasną, jednoznaczną gramatyką i możliwością rozbudowy o nowe elementy,
  2. lekkie obiekty encji – Doctrine nie narzuca żadnych interfejsów, ani klas do rozszerzenia,
  3. wsparcie dla transakcji oraz inteligentne kolejkowanie zapytań do wykonania w celu uzyskania jak największej wydajności,
  4. opis struktury bazy danych poprzez mechanizm adnotacji, lub w formatach XML/YAML,
  5. wsparcie dla dziedziczenia tabel na poziomie biblioteki,
  6. duże możliwości rozszerzania,
  7. mechanizm buforowania.

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.

Wymagania

[edytuj | edytuj kod]

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).

Przykład użycia

[edytuj | edytuj kod]

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.

Linki zewnętrzne

[edytuj | edytuj kod]