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.

Doctrine 2.0: A evolução da persistência em PHP

10,939 views

Published on

Portuguese talk exposing new features of Doctrine 2.0 ORM for PHP

Published in: Technology
  • Be the first to comment

Doctrine 2.0: A evolução da persistência em PHP

  1. 1. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine 2.0 A evolução da persistência em PHP PHP Conference Brazil 2009 www.doctrine-project.org
  2. 2. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Guilherme Blanco • Desenvolvedor há 10+ anos • Evangelista de projetos OS • Trabalhar para Naspers/MIH • Contribui para... • ...Doctrine • ...Zend Framework • ...Symfony • ...PHP • ...etc PHP Conference Brazil 2009 www.doctrine-project.org
  3. 3. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Guilherme Blanco • http://www.twitter.com/guilhermeblanco • http://www.facebook.com/guilhermeblanco Versão modificada da apresentada na ZendCon UnCon 2009. Esta apresentação é a tradução da palestra apresentada por Jonathan Wage no Big LAMP Camp 2009 em Nashville, TN. PHP Conference Brazil 2009 www.doctrine-project.org
  4. 4. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O que estão falando por aí? • “Quanto mais eu uso Doctrine, mais e mais eu imagino como consegui viver até hoje sem ele” - @sidhighwind • “PHP 5.3.1 lançado hoje. Queria que Cpanel integrasse no EasyApache. Quero namespaces e Doctrine 2!” - @diffkid • “Fazendo meu primeiro site com Symfony e Doctrine. Mais fácil que imaginei!” - @timbowler • “Implementado Doctrine ORM com sucesso no Zend Framework para meu próximo projeto. Está demais!” - @otobrglez • http://twitter.com/#search?q=%23doctrine PHP Conference Brazil 2009 www.doctrine-project.org
  5. 5. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Quantos já usaram Doctrine? • Pre 1.0? • 1.0? • 1.1? • 1.2? • 2.0? PHP Conference Brazil 2009 www.doctrine-project.org
  6. 6. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine 1.0 • Primeiro commit em 13 de Abril de 2006 • Concluído e lançado em 1 de Setembro de 2008 • Uma das 1as. implementações de ORM para PHP • Primeiro lançamento LTS (Long Term Support). Mantido até 1 de Março de 2010 • Integra-se com frameworks populares: Symfony, Zend Framework, Code Igniter, etc. PHP Conference Brazil 2009 www.doctrine-project.org
  7. 7. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine 1.1 • Evolução continuada da 1.0 • Dezenas de pequenas melhorias • Novos recursos significantes • Bug fixes? Impossível contabilizar... PHP Conference Brazil 2009 www.doctrine-project.org
  8. 8. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine 1.2 • Último lançamento LTS da versão 1.x • Mais e mais bug fixes • Mais melhorias • Dezenas de novos recursos • Lançamento em 2 semanas!!! PHP Conference Brazil 2009 www.doctrine-project.org
  9. 9. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine 2.0 PHP Conference Brazil 2009 www.doctrine-project.org
  10. 10. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Compatível com PHP 5.3.0+ PHP Conference Brazil 2009 www.doctrine-project.org
  11. 11. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Três principais pacotes PHP Conference Brazil 2009 www.doctrine-project.org
  12. 12. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Common PHP Conference Brazil 2009 www.doctrine-project.org
  13. 13. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel DBAL PHP Conference Brazil 2009 www.doctrine-project.org
  14. 14. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel ORM PHP Conference Brazil 2009 www.doctrine-project.org
  15. 15. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Implementado integralmente usando namespaces PHP Conference Brazil 2009 www.doctrine-project.org
  16. 16. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Código em Namespace namespace DoctrineORM; use DoctrineORMQueryExpr, DoctrineCommonDoctrineException; /** * This class is responsible for building DQL query strings via an object oriented * PHP interface. * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 * @version $Revision$ * @author Guilherme Blanco <guilhermeblanco@hotmail.com> * @author Jonathan Wage <jonwage@gmail.com> * @author Roman Borschel <roman@code-factory.org> */ class QueryBuilder { PHP Conference Brazil 2009 www.doctrine-project.org
  17. 17. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Usando Namespaces use DoctrineORMQueryBuilder; $qb = new QueryBuilder($em); $qb->select('u') ->from('ModelsUser', 'u') ->orderBy('u.username', 'ASC'); $q = $qb->getQuery(); $users = $q->execute(); PHP Conference Brazil 2009 www.doctrine-project.org
  18. 18. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Acompanha os padrões de interoperabilidade técnica do PHP 5.3 PSR = PHP Standards Recommendation http://tr.im/psr_0 PHP Conference Brazil 2009 www.doctrine-project.org
  19. 19. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O que isso significa? • Bibliotecas PHP finalmente serão 100% interoperáveis, com a melhor performance possível de carga • Symfony, Doctrine, Zend Framework, PEAR2/Pyrus, Typo3, Lithium, Flow3, Solar, Agavi, etc. • Carregue classes de 3 bibliotecas diferentes com um único autoloader e um único include path • Compartilhe a implementação da SplClassLoader! http://gist.github.com/221634 • Interessados em implementar SplClassLoader em C ??? =) PHP Conference Brazil 2009 www.doctrine-project.org
  20. 20. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Performance do PHP 5.3 PHP Conference Brazil 2009 www.doctrine-project.org
  21. 21. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine 1 e 2 possuem aumento de performance significativos com o PHP 5.3 PHP Conference Brazil 2009 www.doctrine-project.org
  22. 22. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel -30% Consumo de Memória PHP Conference Brazil 2009 www.doctrine-project.org
  23. 23. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel +20% Rapidez PHP Conference Brazil 2009 www.doctrine-project.org
  24. 24. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Qual é o meu ponto de vista? USE PHP 5.3! PHP Conference Brazil 2009 www.doctrine-project.org
  25. 25. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Números falam por si só Doctrine 1.1 4.3 s para 5000 registros Doctrine 2.0 1.4 s para 5000 registros Doctrine 2.0 3.5 s para 10000 registros PHP Conference Brazil 2009 www.doctrine-project.org
  26. 26. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine 2 é RÁPIDO! PHP Conference Brazil 2009 www.doctrine-project.org
  27. 27. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O código não é tão ruim aos olhos PHP Conference Brazil 2009 www.doctrine-project.org
  28. 28. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Chega de impôr dados no meu modelo de domínio!!! PHP Conference Brazil 2009 www.doctrine-project.org
  29. 29. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O jeito Doctrine 1.X class User extends Doctrine_Record { public function setTableDefinition() { $this->hasColumn('id', 'integer', null, array( 'primary' => true, 'auto_increment' => true )); $this->hasColumn('username', 'string', 255); } } PHP Conference Brazil 2009 www.doctrine-project.org
  30. 30. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Qual é o problema? • Pfff... Requer extender Doctrine_Record • Impõe métodos, propriedades e mais lixo nos nossos objetos de domínio • Necessário instanciar um objeto “burro” User para obter metadados do modelo • LenTU...feIU i sImPLeSMENti xXxATu!!!!! =P PHP Conference Brazil 2009 www.doctrine-project.org
  31. 31. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O novo jeito Doctrine 2 Especifique as informações de mapeamento using doc block Annotations, YAML, XML ou PHP. PHP Conference Brazil 2009 www.doctrine-project.org
  32. 32. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Com Annotations /** * @Entity * @Table(name="user") */ class User { /** * @Id * @Column(type="integer") * @GeneratedValue(strategy="auto") */ public $id; /** * @Column(type="string", length=255) */ public $username; } PHP Conference Brazil 2009 www.doctrine-project.org
  33. 33. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Com YAML EntitiesUser: type: entity table: users fields: id: type: integer id: true generator: strategy: AUTO name: type: string(50) PHP Conference Brazil 2009 www.doctrine-project.org
  34. 34. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Com XML <?xml version="1.0" encoding="utf-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xsi="http:// www.w3.org/2001/XMLSchema-instance" schemaLocation="http://doctrine-project.org/schemas/orm/ doctrine-mapping.xsd"> <entity name="EntitiesUser" table="users"> <field name="name" type="string" column="name" length="50" precision="0" scale="0"> <options/> </field> <id name="id" type="integer" column="id"> <generator strategy="AUTO"/> </id> </entity> </doctrine-mapping> PHP Conference Brazil 2009 www.doctrine-project.org
  35. 35. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Com PHP use DoctrineORMMappingClassMetadataInfo; $metadata->setInheritanceType(ClassMetadataInfo::INHERITANCE_TYPE_NONE); $metadata->setPrimaryTable(array( 'name' => 'users', )); $metadata->mapField(array( 'fieldName' => 'id', 'type' => 'integer', 'id' => true, 'columnName' => 'id', )); $metadata->mapField(array( 'fieldName' => 'name', 'type' => 'string', 'length' => '50', 'columnName' => 'name', )); $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO); PHP Conference Brazil 2009 www.doctrine-project.org
  36. 36. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Sem a necessidade de extender a classe Base... $user = new EntitiesUser(); $user->setUsername('jwage'); print_r($user); User Object ( [id] => [username] => jwage ) ...significa modelo de domínio limpo! PHP Conference Brazil 2009 www.doctrine-project.org
  37. 37. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine 2 é quase integralmente desacoplado. Você pode utilizar recursos individualmente PHP Conference Brazil 2009 www.doctrine-project.org
  38. 38. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Use a DBAL sem a ORM! PHP Conference Brazil 2009 www.doctrine-project.org
  39. 39. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Database Abstraction Layer • A DBAL é um projeto poderoso por si só • Baseada em código de outros projetos: – PEAR MDB2 – Zend_Db PHP Conference Brazil 2009 www.doctrine-project.org
  40. 40. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Database Abstraction Layer • Utilizar a Doctrine DBAL sozinha é uma boa opção para projetos PHP se uma ORM completa não é necessária • API para executar queries, alterações no schema, etc. • Conecta-se com diferentes tipos de bases de dados: mysql, sqlite, pgsql, oracle, etc. PHP Conference Brazil 2009 www.doctrine-project.org
  41. 41. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Examplos de uso da DBAL PHP Conference Brazil 2009 www.doctrine-project.org
  42. 42. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Criando conexão com o MySQL $params = array( 'driver' => 'pdo_mysql', 'host' => 'localhost', 'user' => 'root', 'password' => '', 'dbname' => 'doctrine2dbal' ); $conn = DoctrineDBALDriverManager::getConnection($params); PHP Conference Brazil 2009 www.doctrine-project.org
  43. 43. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Obtendo o Schema Manager $sm = $conn->getSchemaManager(); PHP Conference Brazil 2009 www.doctrine-project.org
  44. 44. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Schema Manager • Dispara DDLs através de uma API intuitiva: – createTable() – dropTable() – createForeignKey() • Introspecção do seu schema: – listTables() – listTableColumns() – listUsers() PHP Conference Brazil 2009 www.doctrine-project.org
  45. 45. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Remover e Criar uma Tabela $columns = array( 'id' => array( 'type' => Type::getType('integer'), 'autoincrement' => true, 'primary' => true, 'notnull' => true ), 'name' => array( 'type' => Type::getType('string'), 'length' => 255 ), ); $sm->dropAndCreateTable('user', $columns); PHP Conference Brazil 2009 www.doctrine-project.org
  46. 46. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Criar uma chave estrangeira $definition = array( 'name' => 'user_id_fk', 'local' => 'user_id', 'foreign' => 'id', 'foreignTable' => 'user' ); $sm->createForeignKey('profile', $definition); PHP Conference Brazil 2009 www.doctrine-project.org
  47. 47. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel E muito mais... • DBAL cheia de recursos para manipular sua base com comandos DDL • Inspecione sua base e aprenda sobre ela • Execute queries e recupere dados • Suporte a transações PHP Conference Brazil 2009 www.doctrine-project.org
  48. 48. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O recurso chave da ORM PHP Conference Brazil 2009 www.doctrine-project.org
  49. 49. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Doctrine Query Language PHP Conference Brazil 2009 www.doctrine-project.org
  50. 50. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel DQL significa Doctrine Query Language e é fortemente influenciada por HQL do Hibernate PHP Conference Brazil 2009 www.doctrine-project.org
  51. 51. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Dialeto OQL (Object Query Language) proprietário PHP Conference Brazil 2009 www.doctrine-project.org
  52. 52. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel A DQL é processada por um parser LL(*) escrito manualmente PHP Conference Brazil 2009 www.doctrine-project.org
  53. 53. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Constrói AST PHP Conference Brazil 2009 www.doctrine-project.org
  54. 54. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel AST = Abstract Syntax Tree PHP Conference Brazil 2009 www.doctrine-project.org
  55. 55. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Representação na forma de Árvore de uma estrutura sintática de um código de uma linguagem PHP Conference Brazil 2009 www.doctrine-project.org
  56. 56. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Nomes de classes PHP do DQL parser representam diretamente a linguagem OrderByClause.php SelectClause.php SelectExpression.php Subselect.php DeleteClause.php etc. etc. PHP Conference Brazil 2009 www.doctrine-project.org
  57. 57. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Cada recurso DQL possui uma classe para manipular seu processamento PHP Conference Brazil 2009 www.doctrine-project.org
  58. 58. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel • Fácil de usar • Fácil de expandir e incluir novos recursos • Fácil de usar e entender o processamento de uma consulta DQL • Expanda o DQL parser com sua própria funcionalidade e adicione à linguagem DQL PHP Conference Brazil 2009 www.doctrine-project.org
  59. 59. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O DQL parser é muito rápido. Com um cache de SQL gerada fica praticamente invisível. PHP Conference Brazil 2009 www.doctrine-project.org
  60. 60. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Exemplo de DQL Query $query = $em->createQuery( 'SELECT u, g, FROM User u ' . 'LEFT JOIN u.Groups g ' . 'ORDER BY u.name ASC, g.name ASC' ); $users = $query->execute(); PHP Conference Brazil 2009 www.doctrine-project.org
  61. 61. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Usando o QueryBuilder $qb = $em->createQueryBuilder() ->select('u, g') ->from('User', 'u') ->leftJoin('u.Groups', 'g') ->orderBy('u.name', 'ASC') ->addOrderBy('g.name', 'ASC'); $query = $qb->getQuery(); PHP Conference Brazil 2009 www.doctrine-project.org
  62. 62. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Executando as Queries $users = $query->execute(); foreach ($users as $user) { // ... foreach ($user->getGroups() as $group) { // ... } } PHP Conference Brazil 2009 www.doctrine-project.org
  63. 63. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Trabalhando com Entidades PHP Conference Brazil 2009 www.doctrine-project.org
  64. 64. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O EntityManager PHP Conference Brazil 2009 www.doctrine-project.org
  65. 65. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel O EntityManager é responsável por gerenciar a persistência das Entidades PHP Conference Brazil 2009 www.doctrine-project.org
  66. 66. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Criando o EntityManager $config = new DoctrineORMConfiguration(); $config->setMetadataCacheImpl(new DoctrineCommonCacheArrayCache); $config->setProxyDir(__DIR__ . '/Proxies'); $config->setProxyNamespace('Proxies'); $connectionOptions = array( 'driver' => 'pdo_sqlite', 'path' => 'database.sqlite' ); $em = DoctrineORMEntityManager::create($connectionOptions, $config); PHP Conference Brazil 2009 www.doctrine-project.org
  67. 67. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Persistindo Entidades $user = new User; $user->setUsername('gblanco'); $user->setPassword('changeme'); $profile = new Profile; $profile->setName('Guilherme Blanco'); $user->setProfile($user); $em->persist($user); $em->persist($profile); $em->flush(); PHP Conference Brazil 2009 www.doctrine-project.org
  68. 68. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Removendo Entidades $user1 = $em->find('User', 1); $user2 = $em->find('User', 2); $em->remove($user1); $em->remove($user2); $em->flush(); PHP Conference Brazil 2009 www.doctrine-project.org
  69. 69. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel EntityManager::flush() • Executa quaisquer alterações das entidades gerenciadas • Executa de forma eficiente comandos de insert, update e delete (Topological Sorting) • Mantenha o número de operações flush() baixo (1-2 vezes por requisição) PHP Conference Brazil 2009 www.doctrine-project.org
  70. 70. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Cache de Metadados $config = new DoctrineORMConfiguration(); $config->setMetadataCacheImpl(new DoctrineCommonCacheApcCache); PHP Conference Brazil 2009 www.doctrine-project.org
  71. 71. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel No ambiente de produção, “cacheie” as instâncias de ClassMetadata populadas via processamento de Annotations, YAML, XML, etc. PHP Conference Brazil 2009 www.doctrine-project.org
  72. 72. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Cache de Queries $config->setQueryCacheImpl(new DoctrineCommonCacheApcCache); PHP Conference Brazil 2009 www.doctrine-project.org
  73. 73. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel No ambiente de produção, “cacheie” o processamento da consulta DQL armazenando a SQL final gerada PHP Conference Brazil 2009 www.doctrine-project.org
  74. 74. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Cache de Resultados $config->setResultCacheImpl(new DoctrineCommonCacheApcCache); PHP Conference Brazil 2009 www.doctrine-project.org
  75. 75. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Em ambiente de produção, “cacheie” os dados populados prevenindo consultas desnecessárias à base de dados PHP Conference Brazil 2009 www.doctrine-project.org
  76. 76. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Usando o Cache de Resultados $query = $em->createQuery('SELECT u FROM ModelsUser u') $query->useResultCache(true, 3600, 'user_query'); $users = $query->execute(); Execute novamente e os resultados serão retornados do cache ao invés de acessar a base novamente $users = $query->execute(); PHP Conference Brazil 2009 www.doctrine-project.org
  77. 77. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Usando o Cache de Resultados O processamento desta query só acontece uma vez com o Cache de Query $query = $em->createQuery('SELECT u FROM ModelsUser u') $query->useResultCache(true, 3600, 'user_query'); $users = $query->execute(); Execute novamente e os resultados serão retornados do cache ao invés de acessar a base novamente $users = $query->execute(); PHP Conference Brazil 2009 www.doctrine-project.org
  78. 78. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Mapeando Herança PHP Conference Brazil 2009 www.doctrine-project.org
  79. 79. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Mapped Superclasses PHP Conference Brazil 2009 www.doctrine-project.org
  80. 80. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel /** @MappedSuperclass */ abstract class MappedSuperclassBase { /** @Column(type="integer") */ private $mapped1; /** @Column(type="string") */ private $mapped2; /** * @OneToOne(targetEntity="MappedSuperclassRelated1") * @JoinColumn(name="related1_id", referencedColumnName="id") */ private $mappedRelated1; // ... more fields and methods } PHP Conference Brazil 2009 www.doctrine-project.org
  81. 81. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Extende a Superclass PHP Conference Brazil 2009 www.doctrine-project.org
  82. 82. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel /** @Entity */ class EntitySubClass extends MappedSuperclassBase { /** @Id @Column(type="integer") */ private $id; /** @Column(type="string") */ private $name; // ... more fields and methods } PHP Conference Brazil 2009 www.doctrine-project.org
  83. 83. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Single Table Inheritance PHP Conference Brazil 2009 www.doctrine-project.org
  84. 84. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel /** * @Entity * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="discriminator", type="string") * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"}) */ class Person { // ... } /** * @Entity */ class Employee extends Person { // ... } PHP Conference Brazil 2009 www.doctrine-project.org
  85. 85. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Single Table • Todas as classes da hierarquia são mapeadas para uma única tabela • Coluna de discriminação usada para distinguir o tipo da linha na tabela • Eficiente para consultar entre todos os tipos na hierarquia ou tipos específicos • Consultas limitadas pelo tipo de discriminição PHP Conference Brazil 2009 www.doctrine-project.org
  86. 86. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Class Table Inheritance PHP Conference Brazil 2009 www.doctrine-project.org
  87. 87. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel /** * @Entity * @InheritanceType("JOINED") * @DiscriminatorColumn(name="discr", type="string") * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"}) */ class Person { // ... } /** @Entity */ class Employee extends Person { // ... } PHP Conference Brazil 2009 www.doctrine-project.org
  88. 88. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Class Table • Cada classe na hierarquia é mapeada em diversas tabelas • Tabela de uma classe filho é linkada com a tabela da classe pai • Coluna de discriminação usada para distinguir o tipo de linha na tabela • Consultas quase sempre requerem joins PHP Conference Brazil 2009 www.doctrine-project.org
  89. 89. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Testes PHP Conference Brazil 2009 www.doctrine-project.org
  90. 90. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel PHPUnit para Test Unitário PHP Conference Brazil 2009 www.doctrine-project.org
  91. 91. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel MacBlanco:tests guilhermeblanco$ phpunit --no-static-backup Doctrine/Tests/AllTests.php PHPUnit 3.4.1 by Sebastian Bergmann. ...............................................S.SS......... 60 / 696 ............................................................ 120 / 696 ............................................................ 180 / 696 ....SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS................... 240 / 696 ............................................................ 300 / 696 ............................................................ 360 / 696 ............................................................ 420 / 696 ............................................................ 480 / 696 ............................................................ 540 / 696 ............................................................ 600 / 696 ......................................SSSS.................. 660 / 696 .....SS.S......S..SS.S......S..SS.S. Time: 5 seconds OK, but incomplete or skipped tests! Tests: 696, Assertions: 1847, Skipped: 55. PHP Conference Brazil 2009 www.doctrine-project.org
  92. 92. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Sismo para Continuous Integration PHP Conference Brazil 2009 www.doctrine-project.org
  93. 93. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel PHP Conference Brazil 2009 www.doctrine-project.org
  94. 94. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel PHP Conference Brazil 2009 www.doctrine-project.org
  95. 95. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Growl Notifications PHP Conference Brazil 2009 www.doctrine-project.org
  96. 96. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Sismo fica de olho em todos nossos projetos. Nós também rodamos os testes do Doctrine 2 em múltiplos banco de dados suportados. PHP Conference Brazil 2009 www.doctrine-project.org
  97. 97. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Tipos Customizados PHP Conference Brazil 2009 www.doctrine-project.org
  98. 98. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel namespace DoctrineDBALTypes; class MyCustomObjectType extends Type { public function getName() { return 'MyCustomObjectType'; } public function getSqlDeclaration(array $fieldDeclaration, DoctrineDBALPlatformsAbstractPlatform $platform) { return $platform->getClobDeclarationSql($fieldDeclaration); } public function convertToDatabaseValue($value, DoctrineDBALPlatformsAbstractPlatform $platform) { return serialize($value); } public function convertToPHPValue($value) { return unserialize($value); } } PHP Conference Brazil 2009 www.doctrine-project.org
  99. 99. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Type::addType( 'MyCustomObjectType', 'DoctrineDBALTypesMyCustomObjectType' ); PHP Conference Brazil 2009 www.doctrine-project.org
  100. 100. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Sobrepondo Tipos PHP Conference Brazil 2009 www.doctrine-project.org
  101. 101. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel class MyString extends StringType { } Type::overrideType('string', 'DoctrineDBALTypesMyString'); PHP Conference Brazil 2009 www.doctrine-project.org
  102. 102. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Perguntas??? PHP Conference Brazil 2009 www.doctrine-project.org
  103. 103. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel Guilherme Blanco guilhermeblanco@php.net +55 16 9215-8480 Twitter: @guilhermeblanco MSN: guilhermeblanco@hotmail.com PHP Conference Brazil 2009 www.doctrine-project.org

×