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

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

  • 1.
    Doctrine 2.0: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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: Aevoluçã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