Zend Framework meets Doctrine 2

4,031 views
3,893 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
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,031
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

×