6. Doctrine 2
Code-Bibliothek für PHP >= 5.3.2
Inspiriert von JPA & Hibernate
Von den Machern von Symfony
De-Facto Standard für ORM in PHP
Für MySQL & Co., aber ...
7. Doctrine 2
... funktioniert auch mit CouchDB, MongoDB
& Co.
ORM trifft es daher eigentlich gar nicht
(mehr)
Ziel: „Mach dir keine Sorgen mehr um die
Persistenz deiner Objekte.“
16. Entity
POPO (= Plain Old PHP Object)
Keine Persistenz-Basisklasse (mehr)
notwendig
Meta-Informationen zur Persistenz als
Annotationen (XML, YAML ebenfalls möglich)
Tabellen-Ebene
Feld-Ebene
Assoziationen
21. Entity Manager
Internals
Unit-of-Work Pattern
Verfolgt Änderungen via
Identity Map mit Objektkopien
Dank PHP‘s „Copy-On-Write“
resourcenschonend
Wiederholtes Laden einer
Entity aus Map
22. Repository
Laden von Entities via Repositories
Default-Repository für Entities
findAll, findOne, findBy, findOneBy, ...
Custom-Repositories halten alle DB-Queries
25. DQL (Doctrine Query
Language)
Abfragesprache, angelehnt an SQL, aber
„objektorientiert“ formuliert
Vereinfacht Umgang mit Objekteigenschaften
und Assoziationen
26. Assoziationen
Analog zu Objekteigenschaften durch
Annotationen kenntlich gemacht
1-1, 1-n und n-n, self-referencing, uni- und
bidirektionale Assoziationen
Support für Composite Keys
30. Entity Proxies
Wird eine App aus der DB geladen, wird
standardmäßig nicht die Users collection
mitgeladen.
Doctrine generiert Proxy-Klassen, die
stellvertretend verwendet werden (instanceof
User == true), bis die Entity tatsächlich
verwendet wird.
Wird eine Assoziation (e.g. foreach)
traversiert, erkennt dies Doctrine und lädt
alle Entities.
31. Vererbung
Unterstützung für
Mapped Superclass
„Daten-Mixin“
Single Table Inheritence
Alle Klassen der Hierarchie in einer Tabelle abgebildet
Descriminator Column zur Klassenbestimmung
Keine Joins notwendig
Class Table Inheritence
Jede Klasse hat eigene Tabelle mit individuellen Eigenschaften
37. Locking
Support für „User-Think-Time“ Locking
Optimistisch
„Es wird schon gutgehen!“
Versions-Feld (int oder timestamp)
Wirft ggf. Exception
Pessimistisch
„Lieber nichts riskieren!“
Nur auf DB-Ebene
38. Doctrine Console (CLI)
Installation via PEAR (oder manuell)
Standard-Kommandos + Eigene Kommandos
(analog Zend_Tool)
Doctrine Console
$ doctrine orm:generate-entities --help
z.B. $ dbal:import / Import SQL file(s) in DB
/
z.B. $ php doctrine.php orm:schema-
tool:create / Erzeugung DB Schema
/
39. Extensions
Doctrine Extensions (Behavior)
Versionable
Sortable
Loggable
Translateable
Tree / Nested Set
…
https://github.com/l3pp4rd/DoctrineExtensions
https://github.com/beberlei/DoctrineExtensions