SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Doctrine 2 ORM
ORM?
Object Relational
    Mapping
Objektgraph   Tabellen &
              Relationen
Doctrine 2?
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 ...
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.“
Doctrine „Projects“
 Ab hier
                ORM
wird‘s cool.


                DBAL



               Common
Common



Class Loading

Annotations
DBAL
Wrapper um PDO

Verbindungsmanagement

SQL-Query Builder

Events (z.B. PostConnect)

Schema Manager

…
ORM



Persistenz für PHP Objekte

Objekt-Orientierte Abfragesprache (DQL)
Installation

Via archive download, git clone oder PEAR

Setup Autoloader

Entity Manager mit Konfigurationsobjekt
initialisieren (DB-Infos, Caching, Pfade, etc.)

(alle Details im Manual)
Exkurs: ZF-Boilerplate
Zend Framework
Development
Plattform

ZF + Doctrine 2 +
PHPUnit + Vagrant +
ElasticSearch + ...

Virtual Box

Open Source
Exkurs: ZF-Boilerplate
Installation Ruby + Vagrant + Virtual Box lokal

git clone https://michael-romer@github.com/michael-
romer/zf-boilerplate.git myApp

$ vagrant box add lucid32 http://files.vagrantup.com/
lucid32.box

$ vagrant up

http://localhost:8080 im Browser aufrufen
ORM Akteure

         EntityManager



Entity               Repository
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
Klasse „App“
Entity „App“
Entity Manager
Konfigurierte Klasse zum Lifecycle-
Management der Entities.

  Verbindungdaten

  Caching-Konfiguration

  MetaData-Driver (z.B. Annotations oder
  YAML)

  …
Entity Manager
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
Repository


Laden von Entities via Repositories

Default-Repository für Entities

  findAll, findOne, findBy, findOneBy, ...

Custom-Repositories halten alle DB-Queries
Repository
Entity „App“ mit Custom
         Repo
DQL (Doctrine Query
     Language)
Abfragesprache, angelehnt an SQL, aber
„objektorientiert“ formuliert

Vereinfacht Umgang mit Objekteigenschaften
und Assoziationen
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
Assoziationen
Assoziationen
Assoziationen
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.
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
Events
Eventsystem für „Custom-Events“

Entity-Lifecycle-Events

preRemove, postRemove, prePersist ,
postPersist, preUpdate, postUpdate, postLoad,
loadClassMetadata, onFlush, onClear
SQL

Native SQL Abfragen bei Bedarf möglich

Custom Mapping von Spalten auf
Eigenschaften

Ggf. Partial Objects zwecks Performance-
Optimierung
Caching
Drivers

  Array

  APC

  Memcached

  XCache

Arten

  DQL Query Cache (SQL Statements)

  Result Cache (Entites)

  Metadata Cache (Annotationen, YAML, etc.)
DQL, Teil 2
Unterstützung für

  Aggregationen (z.B. COUNT)

  Funktionen (z.B. CONCAT)

  Operatoren (z.B. Arithmetik)
Transaktionen
Implizit durch „Unit-of-Work“

Explizit durch
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
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
               /
Extensions
Doctrine Extensions (Behavior)

   Versionable

   Sortable

   Loggable

   Translateable

   Tree / Nested Set

   …

https://github.com/l3pp4rd/DoctrineExtensions

https://github.com/beberlei/DoctrineExtensions
Fin


Doctrine 2: http://www.doctrine-project.org/

Enterprise Patterns: http://martinfowler.com/

ZF-Boilerplate: http://zf-boilerplate.com

Mein Blog: http://www.startup-patterns.de/

Weitere ähnliche Inhalte

Was ist angesagt?

Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbaseStefan Frömken
 
Objektorientierte Programmierung mit extbase und fluid
Objektorientierte Programmierung mit extbase und fluidObjektorientierte Programmierung mit extbase und fluid
Objektorientierte Programmierung mit extbase und fluidOliver Klee
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitFrank Müller
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
JdbcTemplate aus Spring
JdbcTemplate aus SpringJdbcTemplate aus Spring
JdbcTemplate aus Springtutego
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureDr. Christian Betz
 
Optimierung von JPA-­Anwendungen
Optimierung von JPA-­AnwendungenOptimierung von JPA-­Anwendungen
Optimierung von JPA-­Anwendungenhwilming
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit JujuFrank Müller
 
Einführung in den EventBus
Einführung in den EventBusEinführung in den EventBus
Einführung in den EventBustutego
 

Was ist angesagt? (13)

Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
 
Objektorientierte Programmierung mit extbase und fluid
Objektorientierte Programmierung mit extbase und fluidObjektorientierte Programmierung mit extbase und fluid
Objektorientierte Programmierung mit extbase und fluid
 
T3ak12 extbase
T3ak12 extbaseT3ak12 extbase
T3ak12 extbase
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der Nebenläufigkeit
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Hooks
HooksHooks
Hooks
 
JdbcTemplate aus Spring
JdbcTemplate aus SpringJdbcTemplate aus Spring
JdbcTemplate aus Spring
 
Pyparsing
PyparsingPyparsing
Pyparsing
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit Clojure
 
Optimierung von JPA-­Anwendungen
Optimierung von JPA-­AnwendungenOptimierung von JPA-­Anwendungen
Optimierung von JPA-­Anwendungen
 
Modulsystem in Drupal
Modulsystem in DrupalModulsystem in Drupal
Modulsystem in Drupal
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit Juju
 
Einführung in den EventBus
Einführung in den EventBusEinführung in den EventBus
Einführung in den EventBus
 

Ähnlich wie Doctrine 2 - An Introduction (German)

Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17remigius-stalder
 
Abläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenAbläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenChristian Münch
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtOPITZ CONSULTING Deutschland
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit MavenStefan Scheidt
 
Opensource Tools für das Data Center Management
Opensource Tools für das Data Center ManagementOpensource Tools für das Data Center Management
Opensource Tools für das Data Center Managementinovex GmbH
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAOliver Belikan
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...GFU Cyrus AG
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenOPITZ CONSULTING Deutschland
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
Ist ADO.NET EntityFramework das bessere LINQ?
Ist ADO.NET EntityFramework das bessere LINQ?Ist ADO.NET EntityFramework das bessere LINQ?
Ist ADO.NET EntityFramework das bessere LINQ?.NET User Group Dresden
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!OPEN KNOWLEDGE GmbH
 
Multithreading in c# mit tpl
Multithreading in c# mit tplMultithreading in c# mit tpl
Multithreading in c# mit tplDavidT27
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"schellsoft
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrants0enke
 
Production-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 WochenProduction-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 WochenAndré Goliath
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBMario Müller
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101gueste4be40
 

Ähnlich wie Doctrine 2 - An Introduction (German) (20)

Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17
 
Abläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenAbläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisieren
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit Maven
 
Windows Powershell
Windows PowershellWindows Powershell
Windows Powershell
 
Opensource Tools für das Data Center Management
Opensource Tools für das Data Center ManagementOpensource Tools für das Data Center Management
Opensource Tools für das Data Center Management
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GA
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
Einführung Maven
Einführung MavenEinführung Maven
Einführung Maven
 
Ist ADO.NET EntityFramework das bessere LINQ?
Ist ADO.NET EntityFramework das bessere LINQ?Ist ADO.NET EntityFramework das bessere LINQ?
Ist ADO.NET EntityFramework das bessere LINQ?
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
Multithreading in c# mit tpl
Multithreading in c# mit tplMultithreading in c# mit tpl
Multithreading in c# mit tpl
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
 
Production-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 WochenProduction-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 Wochen
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDB
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 

Doctrine 2 - An Introduction (German)

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n