Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Zend Framework meets Doctrine 2Paul Seiffert I 24.11.11                                  © Mayflower GmbH 2010
Paul Seiffert                I Developer @ Mayflower seit                    September 2010                I PHP seit ca. ...
Agenda1. Doctrine 2   i. Übersicht   ii. Architektur   iii. Begriffe2. Zend Framework Integration3. Show Case             ...
Agenda1. Doctrine 2   i. Übersicht   ii. Architektur   iii. Begriffe2. Zend Framework Integration3. Show Case             ...
DoctrineI PHP-ORM    → geschrieben in PHP    → geschrieben für PHPI Mapping von Objekten der  Business-Logik zu Datenbank-...
Doctrine 2                                        2I Komplette Neu-EntwicklungI Im Vergleich zu Doctrine (1):     → Wenige...
Doctrine 2 - Architektur                       Applikationen                       ORM                       DBAL         ...
Doctrine 2 – Entities II Plain Old PHP ObjectsI Vererbung     → Single Table Inheritance     → Class Table InheritanceI Ag...
Doctrine 2 – Entities IInamespace MyProjectEntity;class User{    protected $_id;    protected $_username;    protected $_e...
Doctrine 2 – EntityManager II Zentraler Zugriff auf die ORM-Funktionalität     → Findet Entities     → Persistiert Entitie...
Doctrine 2 – EntityManager II Entity 1                        Entity                                 DB                   ...
Doctrine 2 – EntityManager III// $em is the EntityManager$peter = $em->find(MyProjectEntityUser, 5);$peter->setEmail(peter...
Doctrine 2 – Repositories II Pro Entity-Klasse ein RepositoryI API zur Suche nach Entities     → find, findBy, findBy<attr...
Doctrine 2 – Repositories II     Client                  findMembersOfGroup(group)     User                               ...
Doctrine 2 – Repositories III$repository = $em->getRepository(MyProjectEntityUser);$peter = $repository->findOneBy(       ...
Doctrine 2 – MetadataI Mapping-Anweisungen (Metadaten) beschreiben    → Die persistente Struktur der Daten    → Die Bezieh...
Doctrine 2 – Metadata - XML<?xml version="1.0" encoding="UTF-8"?><doctrine-mapping xmlns="..."   xmlns:xsi="http://www.w3....
Doctrine 2 – Metadata - YAMLMyProjectEntityUser:  type: entity  table: user  id:    id:      type: integer      generator:...
Doctrine 2 – Metadata – PHP// MyProject/mapping/path/Entity/User$metadata->mapField(    array(id => true,          fieldNa...
Doctrine 2 – Metadata – DocBlock Annotations/**  * @Entity  * @Table(name=“user“)  */class User{     /**      * @Id @Colum...
Doctrine 2 ... … es gibt noch so viel zu lernen!I RTFM:  http://www.doctrine-project.org/docs/orm/2.1/                    ...
Agenda1. Doctrine 2   i. Übersicht   ii. Architektur   iii. Begriffe2. Zend Framework Integration3. Show Case             ...
Integration von Doctrine 2 in ZF-ProjekteI Doctrine 2 wird als fester Bestandteil von Symfony 2 entwickeltI Doctrine 2 ist...
Integration – Konfiguration der Classloaderuse DoctrineCommonClassLoader as DoctrineClassLoader;class Bootstrap extends Ze...
Integration – Konfiguration mit Zend_Config[production]doctrine.connectionParameters.driver   = pdo_mysqldoctrine.connecti...
Integration – Konfiguration des EntityManagers Ipublic function _initDoctrineEntityManager(){    $zendConfig = $this->getO...
Integration – Konfiguration des EntityManagers II ...        $configuration->setMetadataDriverImpl(            $configurat...
Thats it!             Mayflower GmbH I 28
CLI ToolDoctrine Command Line Interface version 2.2.0-DEV...Available commands:      Thats it!  help                      ...
Integration – CLII Bootstrap von ZF-Applikation notwendig!    → Anpassung des Standard Doctrine-CLI-Scripts // Erstellen d...
Agenda1. Doctrine 2   i. Übersicht   ii. Architektur   iii. Begriffe2. Zend Framework Integration3. Show Case             ...
Vielen Dank für Eure Aufmerksamkeit!      Referent   Paul Seiffert                 Paul.Seiffert@mayflower.de             ...
LiteraturI Doctrine 2 Documentation  http://www.doctrine-project.org/docs/orm/2.1/en/I Vortrag „Doctrine 2 – Not the same ...
Upcoming SlideShare
Loading in …5
×

Zend Framework meets Doctrine 2

4,292 views

Published on

Der Vortrag "Zend Framework meets Doctrine 2" von Paul Seiffert erklärt die Verwendung von Doctrine 2 in Projekten, die auf Zend Framework (ZF) basieren. Zuerst wird Paul dabei auf das Doctrine 2 ORM und dessen
grundsätzliche Verwendung eingehen (es wird also kein Doctrine 2 - Wissen vorausgesetzt), im weiteren Verlauf wird er die Einbindung des ORMs in ZF-Projekte erklären. Zum Schluss zeigt Paul ein kleines Beispiel-Projekt, in dem ZF und Doctrine 2 gemeinsam zum Einsatz kommen.

Published in: Technology
  • Be the first to comment

Zend Framework meets Doctrine 2

  1. 1. Zend Framework meets Doctrine 2Paul Seiffert I 24.11.11 © Mayflower GmbH 2010
  2. 2. Paul Seiffert I Developer @ Mayflower seit September 2010 I PHP seit ca. 8 Jahren I Mobile Application Development I B.Sc. Computer Science (TU München) I facebook.com/seiffertp Mayflower GmbH I 2
  3. 3. Agenda1. Doctrine 2 i. Übersicht ii. Architektur iii. Begriffe2. Zend Framework Integration3. Show Case Mayflower GmbH I 3
  4. 4. Agenda1. Doctrine 2 i. Übersicht ii. Architektur iii. Begriffe2. Zend Framework Integration3. Show Case Mayflower GmbH I 4
  5. 5. DoctrineI PHP-ORM → geschrieben in PHP → geschrieben für PHPI Mapping von Objekten der Business-Logik zu Datenbank-RecordsI Mapping von Klassen der Business-Logik zu Datenbank-TabellenI API basiert auf Hibernate (Java)I Repository- und Row-Data-Gateway-Pattern Mayflower GmbH I 5
  6. 6. Doctrine 2 2I Komplette Neu-EntwicklungI Im Vergleich zu Doctrine (1): → Weniger Magie → Um Welten performanter → Besseres Caching → Bessere Erweiterbarkeit → 100% PHP 5.3 Mayflower GmbH I 6
  7. 7. Doctrine 2 - Architektur Applikationen ORM DBAL Common Mayflower GmbH I 7
  8. 8. Doctrine 2 – Entities II Plain Old PHP ObjectsI Vererbung → Single Table Inheritance → Class Table InheritanceI Aggregation / Composition → Management von 1:1, 1:n und n:m Relationen Mayflower GmbH I 8
  9. 9. Doctrine 2 – Entities IInamespace MyProjectEntity;class User{ protected $_id; protected $_username; protected $_email; Beispiel? public function getId() { return $this->_id; } ...} Mayflower GmbH I 9
  10. 10. Doctrine 2 – EntityManager II Zentraler Zugriff auf die ORM-Funktionalität → Findet Entities → Persistiert Entities → Stellt Entity-Repositories zur VerfügungI Aggregiert Änderungen und schreibt diese in Paketen (Unit of Work) zurück in die DB Mayflower GmbH I 10
  11. 11. Doctrine 2 – EntityManager II Entity 1 Entity DB Manager Entity 2 Mayflower GmbH I 11
  12. 12. Doctrine 2 – EntityManager III// $em is the EntityManager$peter = $em->find(MyProjectEntityUser, 5);$peter->setEmail(peter@example.com);$em->flush();$paul = new User();$paul->setUsername(Paul);$paul->setEmail(paul@example.com);$em->persist($paul);$em->flush(); Mayflower GmbH I 12
  13. 13. Doctrine 2 – Repositories II Pro Entity-Klasse ein RepositoryI API zur Suche nach Entities → find, findBy, findBy<attributeName> → eigene Such-MethodenI spezielle Funktionalität durch Custom Repositories Mayflower GmbH I 13
  14. 14. Doctrine 2 – Repositories II Client findMembersOfGroup(group) User Repository find(3)find(User, 3) Entity DB Manager Mayflower GmbH I 14
  15. 15. Doctrine 2 – Repositories III$repository = $em->getRepository(MyProjectEntityUser);$peter = $repository->findOneBy( array(username => peter));$peter = $repository->findOneByUsername(peter);$administrators = $repository->findBy( array(admin => true));$administrators = $repository->findByAdmin(true); Mayflower GmbH I 15
  16. 16. Doctrine 2 – MetadataI Mapping-Anweisungen (Metadaten) beschreiben → Die persistente Struktur der Daten → Die Beziehungen zwischen KlassenI Metadaten können unterschiedlich vorliegen: → XML → YAML → PHP → DocBlock Annotations Mayflower GmbH I 16
  17. 17. Doctrine 2 – Metadata - XML<?xml version="1.0" encoding="UTF-8"?><doctrine-mapping xmlns="..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="..."> <entity name="MyProjectEntityUser" table="user"> <id name="id" type="integer" column="id"> <generator strategy="AUTO"/> </id> <field name="username" column="username" type="string" length="50" nullable="false" unique="true" /> <field name="email" column="user_email" type="string" column-definition="CHAR(80) NOT NULL" /> </entity></doctrine-mapping> Mayflower GmbH I 17
  18. 18. Doctrine 2 – Metadata - YAMLMyProjectEntityUser: type: entity table: user id: id: type: integer generator: strategy: AUTO fields: name: type: string length: 50 email: type: string length: 80 Mayflower GmbH I 18
  19. 19. Doctrine 2 – Metadata – PHP// MyProject/mapping/path/Entity/User$metadata->mapField( array(id => true, fieldName => id, type => integer));$metadata->mapField( array(fieldName => username, type => string)); Mayflower GmbH I 19
  20. 20. Doctrine 2 – Metadata – DocBlock Annotations/** * @Entity * @Table(name=“user“) */class User{ /** * @Id @Column(type="integer", name=“id“) * @GeneratedValue */ protected $_id; /** @Column(type="string", name=“username“) */ protected $_username; /** @Column(type="string", name=“email“) */ protected $_email;} Mayflower GmbH I 20
  21. 21. Doctrine 2 ... … es gibt noch so viel zu lernen!I RTFM: http://www.doctrine-project.org/docs/orm/2.1/ Mayflower GmbH I 21
  22. 22. Agenda1. Doctrine 2 i. Übersicht ii. Architektur iii. Begriffe2. Zend Framework Integration3. Show Case Mayflower GmbH I 22
  23. 23. Integration von Doctrine 2 in ZF-ProjekteI Doctrine 2 wird als fester Bestandteil von Symfony 2 entwickeltI Doctrine 2 ist jünger als Zend Framework (1).I Aktuell: ZF 1.11.11, Doctrine 2.1I Doctrine 2 basiert auf PHP 5.3 → Namespaces Mayflower GmbH I 23
  24. 24. Integration – Konfiguration der Classloaderuse DoctrineCommonClassLoader as DoctrineClassLoader;class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ public function _initDoctrineClassLoader() { $classLoader = new DoctrineClassLoader(Doctrine); $classLoader->register(); return $classLoader; } public function _initSymfonyClassLoader() { $classLoader = new DoctrineClassLoader(Symfony); $classLoader->register(); return $classLoader; }} Mayflower GmbH I 24
  25. 25. Integration – Konfiguration mit Zend_Config[production]doctrine.connectionParameters.driver = pdo_mysqldoctrine.connectionParameters.host = localhostdoctrine.connectionParameters.user = secret_usernamedoctrine.connectionParameters.password = secret_passworddoctrine.connectionParameters.dbname = dzfdoctrine.autoGenerateProxyClasses = 0doctrine.proxyPath = APPLICATION_PATH "/models/Proxy"doctrine.proxyNamespace = Proxydoctrine.entityPath = APPLICATION_PATH "/models/Entity". . .[development : production]doctrine.autoGenerateProxyClasses = 1. . . Mayflower GmbH I 25
  26. 26. Integration – Konfiguration des EntityManagers Ipublic function _initDoctrineEntityManager(){ $zendConfig = $this->getOptions(); $connectionParameters = $zendConfig[doctrine][connectionParameters]; $configuration = new DoctrineConfiguration(); $configuration->setMetadataCacheImpl( $this->getResource(doctrineCache)); $configuration->setResultCacheImpl( $this->getResource(doctrineCache)); $configuration->setAutoGenerateProxyClasses( $zendConfig[doctrine][autoGenerateProxyClasses]); $configuration->setProxyDir( $zendConfig[doctrine][proxyPath]); $configuration->setProxyNamespace( $zendConfig[doctrine][proxyNamespace]);... Mayflower GmbH I 26
  27. 27. Integration – Konfiguration des EntityManagers II ... $configuration->setMetadataDriverImpl( $configuration->newDefaultAnnotationDriver( $zendConfig[doctrine][entityPath])); $eventManager = new DoctrineEventManager(); $entityManager = DoctrineEntityManager::create( $connectionParameters, $configuration, $eventManager); Zend_Registry::set(em, $entityManager); return $entityManager; } Mayflower GmbH I 27
  28. 28. Thats it! Mayflower GmbH I 28
  29. 29. CLI ToolDoctrine Command Line Interface version 2.2.0-DEV...Available commands: Thats it! help Displays help for a command list Lists commandsdbal dbal:import Import SQL file(s) directly to Database. dbal:run-sql Executes arbitrary SQL directly from the command line.orm orm:clear-cache:metadata Clear all metadata cache of the various cache drivers. orm:clear-cache:query Clear all query cache of the various cache drivers. orm:clear-cache:result Clear all result cache of the various cache drivers. orm:convert-d1-schema Converts Doctrine 1.X schema into a Doctrine 2.X schema. orm:convert-mapping Convert mapping information between supported formats. orm:ensure-production-settings Verify that Doctrine is properly configured for a production environment. orm:generate-entities Generate entity classes and method stubs from your mapping information. orm:generate-proxies Generates proxy classes for entity classes. orm:generate-repositories Generate repository classes from your mapping information. orm:info Show basic information about all mapped entities orm:run-dql Executes arbitrary DQL directly from the command line. orm:schema-tool:create Processes the schema and either create it directly on EntityManagerStorage Connection or generate the SQL output. orm:schema-tool:drop Drop the complete database schema of EntityManager Storage Connection orgenerate the corresponding SQL output. orm:schema-tool:update Executes (or dumps) the SQL needed to update the database schema to matchthe current mapping metadata. orm:validate-schema Validate the mapping files. Mayflower GmbH I 29
  30. 30. Integration – CLII Bootstrap von ZF-Applikation notwendig! → Anpassung des Standard Doctrine-CLI-Scripts // Erstellen der Zend_Application und Bootstrapping /** * @var DoctrineORMEntityManager $entityManager */ $entityManager = Zend_Registry::get(em); $helperSet = new SymfonyComponentConsoleHelperHelperSet( array(db => new DoctrineDBALToolsConsoleHelperConnectionHelper( $entityManager->getConnection()), em => new DoctrineORMToolsConsoleHelperEntityManagerHelper( $entityManager))); DoctrineORMToolsConsoleConsoleRunner::run($helperSet); Mayflower GmbH I 30
  31. 31. Agenda1. Doctrine 2 i. Übersicht ii. Architektur iii. Begriffe2. Zend Framework Integration3. Show Case Mayflower GmbH I 31
  32. 32. Vielen Dank für Eure Aufmerksamkeit! Referent Paul Seiffert Paul.Seiffert@mayflower.de +49 89 242054 1172 Mayflower GmbH Mannhardtstrasse6 80538 München19.12.11 Mayflower GmbH 32
  33. 33. LiteraturI Doctrine 2 Documentation http://www.doctrine-project.org/docs/orm/2.1/en/I Vortrag „Doctrine 2 – Not the same Old PHP ORM“ von Jonathan H. Wage Mayflower GmbH I 33

×