SlideShare a Scribd company logo
1 of 103
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

More Related Content

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

Desenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetosDesenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetosLucas Vegi
 
Desenvolvimento Web com Php e jQuery
Desenvolvimento Web com Php e jQueryDesenvolvimento Web com Php e jQuery
Desenvolvimento Web com Php e jQueryFabricio Nogueira
 
Você sabe o que é Plone?
Você sabe o que é Plone?Você sabe o que é Plone?
Você sabe o que é Plone?Bruno Barbosa
 
REST: Faça o Serviço Direito
REST: Faça o Serviço DireitoREST: Faça o Serviço Direito
REST: Faça o Serviço DireitoAlexandre Gaigalas
 
PHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraPHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraKleber Silva
 
Artigo de php
Artigo de phpArtigo de php
Artigo de phprobson
 
Palestra Zend Framework PHPSC Conf 2010
Palestra Zend Framework PHPSC Conf 2010Palestra Zend Framework PHPSC Conf 2010
Palestra Zend Framework PHPSC Conf 2010Flávio Lisboa
 
Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018Gabriel Machado
 
Desenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend FrameworkDesenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend FrameworkDomingos Teruel
 
PHP Symfony, Vale A Pena
PHP Symfony, Vale A PenaPHP Symfony, Vale A Pena
PHP Symfony, Vale A PenaMarcelo Fleury
 

Similar to Doctrine 2.0: A evolução da persistência em PHP (20)

Symfony2 Básico
Symfony2 BásicoSymfony2 Básico
Symfony2 Básico
 
WP Composer
WP ComposerWP Composer
WP Composer
 
Desenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetosDesenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetos
 
Desenvolvimento Web com Php e jQuery
Desenvolvimento Web com Php e jQueryDesenvolvimento Web com Php e jQuery
Desenvolvimento Web com Php e jQuery
 
PHP: Evolução
PHP: EvoluçãoPHP: Evolução
PHP: Evolução
 
Trilha python
Trilha pythonTrilha python
Trilha python
 
Você sabe o que é Plone?
Você sabe o que é Plone?Você sabe o que é Plone?
Você sabe o que é Plone?
 
Php Nuke
Php NukePhp Nuke
Php Nuke
 
REST: Faça o Serviço Direito
REST: Faça o Serviço DireitoREST: Faça o Serviço Direito
REST: Faça o Serviço Direito
 
PHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraPHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e Segura
 
Artigo de php
Artigo de phpArtigo de php
Artigo de php
 
Atendendo o Mercado Mobile usando PHP
Atendendo o Mercado Mobile usando PHPAtendendo o Mercado Mobile usando PHP
Atendendo o Mercado Mobile usando PHP
 
Palestra Zend Framework PHPSC Conf 2010
Palestra Zend Framework PHPSC Conf 2010Palestra Zend Framework PHPSC Conf 2010
Palestra Zend Framework PHPSC Conf 2010
 
Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018
 
Linux Educacional 4.0
Linux Educacional 4.0Linux Educacional 4.0
Linux Educacional 4.0
 
Phpmagazine
PhpmagazinePhpmagazine
Phpmagazine
 
Webinar php extreme 5.3
Webinar php extreme 5.3Webinar php extreme 5.3
Webinar php extreme 5.3
 
Desenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend FrameworkDesenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend Framework
 
Linguagem PHP
Linguagem PHPLinguagem PHP
Linguagem PHP
 
PHP Symfony, Vale A Pena
PHP Symfony, Vale A PenaPHP Symfony, Vale A Pena
PHP Symfony, Vale A Pena
 

More from Guilherme Blanco

PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsGuilherme Blanco
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsGuilherme Blanco
 
ORM dont kill your DB, developers do
ORM dont kill your DB, developers doORM dont kill your DB, developers do
ORM dont kill your DB, developers doGuilherme Blanco
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHPGuilherme Blanco
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPGuilherme Blanco
 
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPIPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPGuilherme Blanco
 
Doctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPDoctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPGuilherme Blanco
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 

More from Guilherme Blanco (14)

Enterprise php
Enterprise phpEnterprise php
Enterprise php
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
 
PHP 7
PHP 7PHP 7
PHP 7
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object Calisthenics
 
ORM dont kill your DB, developers do
ORM dont kill your DB, developers doORM dont kill your DB, developers do
ORM dont kill your DB, developers do
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHP
 
Javascript para adultos
Javascript para adultosJavascript para adultos
Javascript para adultos
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPIPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
 
PHP, Daemons e Multimedia
PHP, Daemons e MultimediaPHP, Daemons e Multimedia
PHP, Daemons e Multimedia
 
Doctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPDoctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHP
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 

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

  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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