SlideShare a Scribd company logo
1 of 34
abstração do banco de dados com

                      PHP Doctrine



Marcelo Akira – marcelo.akira@gmail.com
    Otávio Calaça – otaviocx@gmail.com
                                          Goiânia, 02 de outubro de 2009
Grupo de Desenvolvedores
           PHP de Goiás
   Criado em dezembro de 2007;
   Lista de Discussão:
     −   Mais 300 membros.
   Encontros:
     −   Palestras;
     −   Networking.
   Site:
     −   www.gophp.com.br
   Eventos:
     −   FLISOL, FGSL, Latinoware, Conisli, CONSOFT, PHP
         Conference Brasil ...
Abstração do banco de dados
               com PHP Doctrine


                       Roteiro
• O que é ORM?
  – Por que classes e não tabelas?
• O que é Doctrine?
  – Models
     • Padrão Active Record
  – Principais Recursos
     • Arquivos YAML de Schema   ●
                                     DQL
     • Data fixtures             ●
                                     Listeners
     • Caching                   ●
                                     Behaviors
• Exemplo Prático

                                                 3
Abstração do banco de dados
               com PHP Doctrine


              O que é ORM?
•   Mapeamento Objeto-Relacional;
•   Ponte entre objetos e um BD Relacional;
•   Tabelas são representadas por Classes;
•   Registros por Objetos;
•   Relações são Associações;
•   Abstrai detalhes do SGBD (SQL e métodos
     nativos);
                                          4
Abstração do banco de dados
             com PHP Doctrine


 Por que classes e não tabelas?

• Em uma linguagem orientada a objetos,
  como PHP, é mais fácil lidar com classes e
  objetos que com tabelas relacionais;
• Classes possuem métodos que podem
  introduzir comportamentos às entidades
  (antes tabelas) do sistema.


                                           5
Abstração do banco de dados
             com PHP Doctrine


         O que é Doctrine?

• Uma framework ORM para PHP;
• Funciona com PHP 5.2.3+;
• Inspirado no Hibernate (Java) e no
    ActiveRecord (Ruby on Rails);
• Possui uma linguagem orientada a objetos
    em substituição ao SQL (DQL).

                                         6
Abstração do banco de dados
             com PHP Doctrine


       Mais sobre o Doctrine
• Foi criado por 2006 por Konsta Vesterinen
    (Inativo);
• Há um brasileiro participando no 'core
    team' (Guilherme Blanco);
• A versão 1.0 foi lançada em Setembro de
    2008;
• É utilizado no framework Symphony;

                                              7
Abstração do banco de dados
             com PHP Doctrine


  Abstração de base de dados
• Utiliza PDO (PHP Data Objects): uma
    implementação oficial do PHP para
    abstração de acesso a dados;
• Banco de dados suportados: MySQL,
    PostgreSQL, Oracle, MS SQL, Firebird,
    etc.
• A utilização de PDO diminui a dependência
    de Banco de Dados, aumentando a
    portabilidade de seu sistema;
                                          8
Abstração do banco de dados
             com PHP Doctrine


        Padrão ActiveRecord

• O Doctrine implementa o padrão de projeto
   Active Record;
• Este padrão foi definido por Martin Fowler,
   que mapeia tabelas como classes e
   linhas como objetos e define métodos de
   acesso;


                                            9
Abstração do banco de dados
               com PHP Doctrine


       Exemplo: Active Record
class Funcionario {
  private $nome, $matricula, $salario ...
  public function salvar() ...
  public static function localizar($campo, $valor)...
  public function aumentarSalario( $percentual )...
  public function calcularFerias() ....
  ...
}
$f = Funcionario::localizar('matricula', '123');
$f.aumentarSalario( 1000 );
$f.salvar();
                                                   10
Abstração do banco de dados
                 com PHP Doctrine

Active Record: Models do Doctrine
class User extends Doctrine_Record {
    public function setTableDefinition() {
        $this->hasColumn('username', 'string', 255, array(
                'type' => 'string', 'length' => '255'
            )
        );
        $this->hasColumn('password', 'string', 255, array(
                'type' => 'string', 'length' => '255'
            )
        );
    }
    public function setUp() {
        $this->hasMany('Group as Groups', array(
                'refClass' => 'UserGroup',
                'local' => 'user_id',
                'foreign' => 'group_id'
            )
        );
    }
}
                                                             11
Abstração do banco de dados
                 com PHP Doctrine

Active Record: Models do Doctrine
class Group extends Doctrine_Record {
    public function setTableDefinition() {
        $this->setTableName('groups');
        $this->hasColumn('name', 'string', 255, array(
                'type' => 'string', 'length' => '255'
            )
        );
    }

    public function setUp() {
        $this->hasMany('User as Users', array(
                'refClass' => 'UserGroup',
                'local' => 'group_id',
                'foreign' => 'user_id'
            )
        );
    }
}


                                                         12
Abstração do banco de dados
               com PHP Doctrine

Active Record: Models do Doctrine
• Usando um model:
                                   $group = new Group();
 $group1 = new Group();            $group->name = 'Palestrantes';
 $group1->name = 'Palestrantes';
                                   $user1 = new User();
 $group2 = new Group();            $user1->username = 'otavio';
 $group2->name = 'PHP';            $user1->password = '123456';
 $user = new User();               $user2 = new User();
 $user->username = 'otavio';       $user2->username = 'akira';
 $user->password = '123456';       $user2->password = '654321';
 $user->Groups[] = $group1;
 $user->Groups[] = $group2;        $group->Users[] = $user1;
                                   $group->Users[] = $user2;
 $user->save();                    $group->save();




                                                                    13
Abstração do banco de dados
             com PHP Doctrine


           Onde começar?
• Baixe o pacote Sandbox (caixa de areia)
      – http://www.doctrine-project.org/download

• Siga a introdução My First Project (Meu
    primeiro Projeto), disponível em:
      – http://www.doctrine-
        project.org/documentation/cookbook/1_1/e
        n/my-first-project

                                                   14
Abstração do banco de dados
               com PHP Doctrine


        Diretórios do Sandbox
$ cd Doctrine­1.1.4­Sandbox
$ ls
config.php   – configuração do doctrine
data/        ­ pasta para dados iniciais (fixture)
doctrine     ­ utilitário de linha de comando
doctrine.php – código­fonte do utilitário
index.php    ­ um exemplo de arquivo inicial
lib/         ­ bibliotecas do doctrine
migrations/  ­ pasta para classes de migração
models/      ­ pasta para arquivos de modelos
schema/      ­ pasta para arquivos de estruturas

                                                     15
Abstração do banco de dados
                  com PHP Doctrine


         Configurando o Doctrine
$ vi config.php
define('SANDBOX_PATH', dirname(__FILE__));
define('DOCTRINE_PATH', SANDBOX_PATH . DIRECTORY_SEPARATOR . 'lib');
... define vários outros caminhos ...
// Configurar o DSN é importante para definir o BD
define('DSN', 'mysql://root:123456@localhost/doctrine_testes');
... outras configurações ...




                                                                       16
Abstração do banco de dados
               com PHP Doctrine


  Utilitário de linha de comando
$ cd Doctrine­1.1.4­Sandbox
$ ./doctrine
...
./doctrine create­tables – cria tabelas
./doctrine load­data – carrega dados inicial
./doctrine dql – executa dql
./doctrine generate­yaml­models – gera modelos

... vários outros comandos ...



                                                 17
Abstração do banco de dados
             com PHP Doctrine

Definindo estrutura com YAML 1/2


• Uma das formas de definir uma estrutura, é
   criando um arquivo schema.yml no
   diretório schema.




                                          18
Abstração do banco de dados
                       com PHP Doctrine

     Definindo estrutura com YAML 2/2
                             ... continuação         ... continuação


User:                        Group:                   UserGroup:
  columns:                     tableName: groups        columns:
    id:                        columns:                   user_id: integer(4)
      primary: true              id:                      group_id: integer(4)
      autoincrement: true          primary: true        relations:
      type: integer(4)             autoincrement: true    User:
    username: string(255)          type: integer(4)         onDelete: CASCADE
    password: string(255)        name: string(255)        Group:
  relations:                                                onDelete: CASCADE
    Groups:
      class: Group
      refClass: UserGroup
      foreignAlias: aUsers

Continua ...                 Continua ...




                                                                             19
Abstração do banco de dados
                  com PHP Doctrine


     Gerando tabelas e modelos
• Uma vez criado o arquivo .yml no diretório schema, você
   pode executar o comando seguinte para criar
   automaticamente a base de dados, as tabelas e as
   classes-modelos.

$ ./doctrine build­all
build­all ­ Generated models successfully from YAML schema
build­all ­ Successfully created database for connection "doctrine" 
   named "doctrine_testes"
build­all ­ Created tables successfully




                                                                 20
Abstração do banco de dados
                       com PHP Doctrine


                                  Testando
<?php                                               Esse resultado abaixo é
                                                    esperado, uma vez que a base
require_once('config.php');                         de dados está vazia.
Doctrine::loadModels('models');
                                                      <pre>
$query = new Doctrine_Query();
$query->from('User u, u.Groups g'); // resulta =>     Array
                                                      (
$users = $query->execute();                           )
                                                      </pre>
echo '<pre>';
print_r($users->toArray(true));
echo '</pre>';

?>




                                                                              21
Abstração do banco de dados
                   com PHP Doctrine


                   Utilizando fixture
• Para popular dados no bd, pode-se criar
   um arquivo dados.yml em data/fixtures:
User:
  zyne:
    username: zYne­
    password: changeme
    Groups: [founder, lead, documentation]
  jwage:
    username: jwage
    password: changeme
    Groups: [lead, documentation]

Group:
  founder:
    name: Founder
  lead:
    name: Lead
  documentation:
    name: Documentation

                                             22
Abstração do banco de dados
                  com PHP Doctrine


     Populando a base de dados
• Pode-se carregar novamente as bases de dados e
    popular o BD:
$ ./doctrine build­all­reload
build­all­reload ­ Are you sure you wish to drop your databases? 
   (y/n)
y
build­all­reload ­ Successfully dropped database for connection 
   "doctrine" named "doctrine_testes"
build­all­reload ­ Generated models successfully from YAML schema
build­all­reload ­ Successfully created database for connection 
   "doctrine" named "doctrine_testes"
build­all­reload ­ Created tables successfully
build­all­reload ­ Data was successfully loaded


                                                                    23
Abstração do banco de dados
                 com PHP Doctrine


            Testando novamente
$ php index.php
Array
(
    [0] => Array
        (
            [id] => 1
            [username] => zYne­
            [password] => changeme
            [Groups] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [name] => Founder
                        )

Dados do BD ...


                                                24
Abstração do banco de dados
              com PHP Doctrine


                       Caching
• Armazenar consultas em memória, não
  sendo necessário conectar no banco
  novamente para fazer a mesma consulta.
• Memcache:
  $options = array();
  $cacheDriver = new Doctrine_Cache_Memcache($options);

• DB:
  $cacheConn = Doctrine_Manager::connection(new PDO('sqlite::memory:'));
  $cacheDriver = new Doctrine_Cache_Db(array('connection' => $cacheConn));

• APC:    $cacheDriver = new Doctrine_Cache_Apc();



                                                                    25
Abstração do banco de dados
                com PHP Doctrine


                          Caching
• Usando:
                 $q = Doctrine_Query::create()
                      ->from('Post p')
                      ->leftJoin('p.Comentarios c')
                      ->leftJoin('p.Tags t')
                      ->useResultCache($cacheDriver);
• Ou:
$manager->setAttribute(Doctrine::ATTR_RESULT_CACHE, $cacheDriver);
$q = Doctrine_Query::create()
    ->from('Post p')
    ->leftJoin('p.Comentarios c')
    ->leftJoin('p.Tags t')
    ->useResultCache(true);
                                                              26
Abstração do banco de dados
           com PHP Doctrine


   Doctrine Query Language

• Consultas ao banco de dados usando
  orientação a objetos;
• Gera SQLs complexas a partir de coisas
  simples;
• Funções específicas do DB são
  suportadas.


                                       27
Abstração do banco de dados
                 com PHP Doctrine


      Doctrine Query Language

• DQL:                                • SQL:
                                       SELECT
                                       u.id AS u__id,
                                       u.is_active AS u__is_active,
$q = Doctrine_Query::create()          u.is_super_admin AS u__is_super_admin,
                                       u.first_name AS u__first_name,
    ->from('User u')                   u.last_name AS u__last_name,
    ->leftJoin('u.Phonenumbers p');    u.username AS u__username,
                                       u.password AS u__password,
                                       u.type AS u__type,
                                       u.created_at AS u__created_at,
                                       u.updated_at AS u__updated_at,
                                       p.id AS p__id,
                                       p.user_id AS p__user_id,
                                       p.phonenumber AS p__phonenumber
                                       FROM user u
                                       LEFT JOIN phonenumber p ON u.id = p.user_id




                                                                            28
Abstração do banco de dados
              com PHP Doctrine


                      Listeners
• O Doctrine possui listeners para
  transações, conexões, querys e records;
• Exemplo:
 class User extends Doctrine_Record
 {
     // ...
     public function preInsert(Doctrine_Event $event)
     {
         $event->getInvoker()->created = date('Y-m-d', time());
         $event->getInvoker()->updated = date('Y-m-d', time());
     }
     public function preUpdate(Doctrine_Event $event)
     {
         $event->getInvoker()->updated = date('Y-m-d', time());
     }
 }
                                                                  29
Abstração do banco de dados
             com PHP Doctrine


                Behaviors

• Comportamentos;
    –   Versionable;
    –   Timestampable;
    –   Sluggable;
    –   I18n;
    –   outros...


                                      30
Abstração do banco de dados
              com PHP Doctrine


                     Behaviors

• Exemplo:
 class User extends Doctrine_Record
 {
     // ...
     public function setUp()
     {
         // ...
         $this->actAs('Timestampable');
         $this->actAs('Sluggable', array(
                 'unique'    => true,
                 'fields'    => array('titulo'),
                 'canUpdate' => true
             )
         );
     }
 }
                                                   31
Abstração do banco de dados
     com PHP Doctrine




   Exemplo Prático



                              32
Abstração do banco de dados
                    com PHP Doctrine


                        Referências
•   Site do Doctrine: http://www.doctrine-project.org
•   Padrão Active Record: http://pt.wikipedia.org/wiki/Active_record
•   Slides s/ Doctrine: http://www.slideshare.net/guilhermeblanco
•   PDO: http://br2.php.net/pdo
•   Manual do Doctrine:




                                                                       33
Abstração do banco de dados
        com PHP Doctrine


                FIM

          Perguntas?

Marcelo Akira – marcelo.akira@gmail.com
  Otávio Calaça – otaviocx@gmail.com


           Obrigado!
                                          34

More Related Content

What's hot

Persistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPAPersistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPACaelum
 
Introdução á linguagem Ruby com aplicativo em Rails
Introdução á linguagem Ruby com aplicativo em RailsIntrodução á linguagem Ruby com aplicativo em Rails
Introdução á linguagem Ruby com aplicativo em Railsoverduka
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdoJorge Luís Gregório
 
Automatizando tarefas com Python
Automatizando tarefas com PythonAutomatizando tarefas com Python
Automatizando tarefas com Pythonpugpe
 
Boas práticas com jpa 2 e hibernate flisol 2012
Boas práticas com jpa 2 e hibernate   flisol 2012Boas práticas com jpa 2 e hibernate   flisol 2012
Boas práticas com jpa 2 e hibernate flisol 2012Frederico Maia Arantes
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010lucashungaro
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Mario Guedes
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosRodrigo Nossal
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupWagner Roberto dos Santos
 
Apresentação Ruby no Dojo da UFBA
Apresentação Ruby no Dojo da UFBAApresentação Ruby no Dojo da UFBA
Apresentação Ruby no Dojo da UFBALuciano Borges
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 
Mapeamento Objeto Relacional em PHP com Outlet ORM
Mapeamento Objeto Relacional em PHP com Outlet ORMMapeamento Objeto Relacional em PHP com Outlet ORM
Mapeamento Objeto Relacional em PHP com Outlet ORMFábio Rehm
 
Fluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaFluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaCésar Araújo
 

What's hot (20)

Modern PHP
Modern PHPModern PHP
Modern PHP
 
Persistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPAPersistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPA
 
Introdução á linguagem Ruby com aplicativo em Rails
Introdução á linguagem Ruby com aplicativo em RailsIntrodução á linguagem Ruby com aplicativo em Rails
Introdução á linguagem Ruby com aplicativo em Rails
 
jQuery
jQueryjQuery
jQuery
 
Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 
Automatizando tarefas com Python
Automatizando tarefas com PythonAutomatizando tarefas com Python
Automatizando tarefas com Python
 
Boas práticas com jpa 2 e hibernate flisol 2012
Boas práticas com jpa 2 e hibernate   flisol 2012Boas práticas com jpa 2 e hibernate   flisol 2012
Boas práticas com jpa 2 e hibernate flisol 2012
 
Java 9, 10 e ... 11
Java 9, 10 e ... 11Java 9, 10 e ... 11
Java 9, 10 e ... 11
 
Python e bancos NoSQL
Python e bancos NoSQLPython e bancos NoSQL
Python e bancos NoSQL
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
Implementação de
Implementação de Implementação de
Implementação de
 
Apresentação Ruby no Dojo da UFBA
Apresentação Ruby no Dojo da UFBAApresentação Ruby no Dojo da UFBA
Apresentação Ruby no Dojo da UFBA
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 
Mapeamento Objeto Relacional em PHP com Outlet ORM
Mapeamento Objeto Relacional em PHP com Outlet ORMMapeamento Objeto Relacional em PHP com Outlet ORM
Mapeamento Objeto Relacional em PHP com Outlet ORM
 
Primeiros Passos Com Elasticsearch
Primeiros Passos Com ElasticsearchPrimeiros Passos Com Elasticsearch
Primeiros Passos Com Elasticsearch
 
Fluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaFluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibana
 

Viewers also liked

Web Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQLWeb Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQLOtávio Calaça Xavier
 
Conhecendo Java
Conhecendo JavaConhecendo Java
Conhecendo JavaTI Infnet
 
Fundamentos de Java
Fundamentos de Java Fundamentos de Java
Fundamentos de Java jmosorio777
 
Fundamentos de java herbert schildt
Fundamentos de java   herbert schildtFundamentos de java   herbert schildt
Fundamentos de java herbert schildtRicardo Ramos
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com HibernateDanilo Braga
 
Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Claudio Martins
 
JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosEduardo Mendes
 
Projeto de arquitetura
Projeto de arquiteturaProjeto de arquitetura
Projeto de arquiteturaEduardo Mendes
 
Projeto e implementacao
Projeto e implementacaoProjeto e implementacao
Projeto e implementacaoEduardo Mendes
 
Introdução a Padrões de Projeto
Introdução a Padrões de ProjetoIntrodução a Padrões de Projeto
Introdução a Padrões de ProjetoEduardo Mendes
 
Padrões de Projeto J2EE para Aplicações Web
Padrões de Projeto J2EE para Aplicações WebPadrões de Projeto J2EE para Aplicações Web
Padrões de Projeto J2EE para Aplicações WebDenis L Presciliano
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de ProjetoEduardo Mendes
 

Viewers also liked (20)

Web Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQLWeb Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQL
 
Adote OpenJDK
Adote OpenJDKAdote OpenJDK
Adote OpenJDK
 
GWT revista espirito
GWT revista espiritoGWT revista espirito
GWT revista espirito
 
Conhecendo Java
Conhecendo JavaConhecendo Java
Conhecendo Java
 
Fundamentos de Java
Fundamentos de Java Fundamentos de Java
Fundamentos de Java
 
Fundamentos de java herbert schildt
Fundamentos de java   herbert schildtFundamentos de java   herbert schildt
Fundamentos de java herbert schildt
 
Java - Aprenda rápido
Java - Aprenda rápidoJava - Aprenda rápido
Java - Aprenda rápido
 
Java para Leigos
Java para LeigosJava para Leigos
Java para Leigos
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com Hibernate
 
Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7
 
JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a Objetos
 
Modelos de software
Modelos de softwareModelos de software
Modelos de software
 
Projeto de arquitetura
Projeto de arquiteturaProjeto de arquitetura
Projeto de arquitetura
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
Grails
GrailsGrails
Grails
 
Processos de software
Processos de softwareProcessos de software
Processos de software
 
Projeto e implementacao
Projeto e implementacaoProjeto e implementacao
Projeto e implementacao
 
Introdução a Padrões de Projeto
Introdução a Padrões de ProjetoIntrodução a Padrões de Projeto
Introdução a Padrões de Projeto
 
Padrões de Projeto J2EE para Aplicações Web
Padrões de Projeto J2EE para Aplicações WebPadrões de Projeto J2EE para Aplicações Web
Padrões de Projeto J2EE para Aplicações Web
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de Projeto
 

Similar to Abstração do banco de dados com PHP Doctrine

Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Thyago Maia
 
Fundamentos da Programação PHP OO - Aula 3
Fundamentos da Programação PHP OO - Aula 3Fundamentos da Programação PHP OO - Aula 3
Fundamentos da Programação PHP OO - Aula 3Thyago Maia
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosGeorge Mendonça
 
Aula05 android persistencia
Aula05 android persistenciaAula05 android persistencia
Aula05 android persistenciaRoberson Alves
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHPAugusto das Neves
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Thyago Maia
 
Gestão automática de configuração usando puppet
Gestão automática de configuração usando puppetGestão automática de configuração usando puppet
Gestão automática de configuração usando puppetDaniel Sobral
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTOPDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTOPerla Coutinho Barbosa
 
Servidor de autenticação centralizada com OpenLDAP
Servidor de autenticação centralizada com OpenLDAPServidor de autenticação centralizada com OpenLDAP
Servidor de autenticação centralizada com OpenLDAPThiago Finardi
 
Servidor de Autenticação Centralizada com OpenLDAP - Thiago Finardi
Servidor de Autenticação Centralizada com OpenLDAP - Thiago FinardiServidor de Autenticação Centralizada com OpenLDAP - Thiago Finardi
Servidor de Autenticação Centralizada com OpenLDAP - Thiago FinardiTchelinux
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHPRangel Javier
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniterAnderson Gonçalves
 
Desenvolvimento Web com PHP - Aula 1
Desenvolvimento Web com PHP - Aula 1Desenvolvimento Web com PHP - Aula 1
Desenvolvimento Web com PHP - Aula 1Thyago Maia
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotationeduardo dias
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
 

Similar to Abstração do banco de dados com PHP Doctrine (20)

Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3
 
Migrando para o PHP 5
Migrando para o PHP 5Migrando para o PHP 5
Migrando para o PHP 5
 
Fundamentos da Programação PHP OO - Aula 3
Fundamentos da Programação PHP OO - Aula 3Fundamentos da Programação PHP OO - Aula 3
Fundamentos da Programação PHP OO - Aula 3
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e Objetos
 
Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
Aula05 android persistencia
Aula05 android persistenciaAula05 android persistencia
Aula05 android persistencia
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
Gestão automática de configuração usando puppet
Gestão automática de configuração usando puppetGestão automática de configuração usando puppet
Gestão automática de configuração usando puppet
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTOPDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
 
Servidor de autenticação centralizada com OpenLDAP
Servidor de autenticação centralizada com OpenLDAPServidor de autenticação centralizada com OpenLDAP
Servidor de autenticação centralizada com OpenLDAP
 
Servidor de Autenticação Centralizada com OpenLDAP - Thiago Finardi
Servidor de Autenticação Centralizada com OpenLDAP - Thiago FinardiServidor de Autenticação Centralizada com OpenLDAP - Thiago Finardi
Servidor de Autenticação Centralizada com OpenLDAP - Thiago Finardi
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHP
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniter
 
Desenvolvimento Web com PHP - Aula 1
Desenvolvimento Web com PHP - Aula 1Desenvolvimento Web com PHP - Aula 1
Desenvolvimento Web com PHP - Aula 1
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotation
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 

More from Otávio Calaça Xavier

Deep learning: a ficção em IA tem se tornado realizade
Deep learning: a ficção em IA tem se tornado realizadeDeep learning: a ficção em IA tem se tornado realizade
Deep learning: a ficção em IA tem se tornado realizadeOtávio Calaça Xavier
 
Internet das coisas (IoT) com Raspberry, Python e Node.js
Internet das coisas (IoT) com Raspberry, Python e Node.jsInternet das coisas (IoT) com Raspberry, Python e Node.js
Internet das coisas (IoT) com Raspberry, Python e Node.jsOtávio Calaça Xavier
 
DevOps: princípios e práticas para a Entrega Contínua
DevOps: princípios e práticas para a Entrega ContínuaDevOps: princípios e práticas para a Entrega Contínua
DevOps: princípios e práticas para a Entrega ContínuaOtávio Calaça Xavier
 
Arquitetura de Software para a Entrega Continua
Arquitetura de Software para a Entrega ContinuaArquitetura de Software para a Entrega Continua
Arquitetura de Software para a Entrega ContinuaOtávio Calaça Xavier
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesOtávio Calaça Xavier
 
Web Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebWeb Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebOtávio Calaça Xavier
 
Implementing Semantic Queries in Online Social Networks
Implementing Semantic Queries in Online Social NetworksImplementing Semantic Queries in Online Social Networks
Implementing Semantic Queries in Online Social NetworksOtávio Calaça Xavier
 
Integrando a Web Social e a Web Semântica com PHP
Integrando a Web Social e a Web Semântica com PHPIntegrando a Web Social e a Web Semântica com PHP
Integrando a Web Social e a Web Semântica com PHPOtávio Calaça Xavier
 
Web Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebWeb Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebOtávio Calaça Xavier
 
Lógica Fuzzy aplicada à Sistemas de Apoio a Decisão
Lógica Fuzzy aplicada à  Sistemas de Apoio a DecisãoLógica Fuzzy aplicada à  Sistemas de Apoio a Decisão
Lógica Fuzzy aplicada à Sistemas de Apoio a DecisãoOtávio Calaça Xavier
 
Fuzzy RDF in the Semantic Web: Deduction and Induction
Fuzzy RDF in the Semantic Web: Deduction and InductionFuzzy RDF in the Semantic Web: Deduction and Induction
Fuzzy RDF in the Semantic Web: Deduction and InductionOtávio Calaça Xavier
 
Desenvolvimento em três camadas com PHP 5, MVC e AJAX
Desenvolvimento em três camadas com PHP 5, MVC e AJAXDesenvolvimento em três camadas com PHP 5, MVC e AJAX
Desenvolvimento em três camadas com PHP 5, MVC e AJAXOtávio Calaça Xavier
 
Introdução ao PHP Orientado a Objetos com Ajax
Introdução ao PHP Orientado a Objetos com AjaxIntrodução ao PHP Orientado a Objetos com Ajax
Introdução ao PHP Orientado a Objetos com AjaxOtávio Calaça Xavier
 
Introdução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPIntrodução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPOtávio Calaça Xavier
 
Classe V: Educação à distância com Videoconferência no Moodle
Classe V: Educação à distância com Videoconferência no MoodleClasse V: Educação à distância com Videoconferência no Moodle
Classe V: Educação à distância com Videoconferência no MoodleOtávio Calaça Xavier
 

More from Otávio Calaça Xavier (20)

Deep learning: a ficção em IA tem se tornado realizade
Deep learning: a ficção em IA tem se tornado realizadeDeep learning: a ficção em IA tem se tornado realizade
Deep learning: a ficção em IA tem se tornado realizade
 
Internet das coisas (IoT) com Raspberry, Python e Node.js
Internet das coisas (IoT) com Raspberry, Python e Node.jsInternet das coisas (IoT) com Raspberry, Python e Node.js
Internet das coisas (IoT) com Raspberry, Python e Node.js
 
DevOps: princípios e práticas para a Entrega Contínua
DevOps: princípios e práticas para a Entrega ContínuaDevOps: princípios e práticas para a Entrega Contínua
DevOps: princípios e práticas para a Entrega Contínua
 
Arquitetura de Software para a Entrega Continua
Arquitetura de Software para a Entrega ContinuaArquitetura de Software para a Entrega Continua
Arquitetura de Software para a Entrega Continua
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 
Web Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebWeb Semântica, a terceira geração da Web
Web Semântica, a terceira geração da Web
 
Implementing Semantic Queries in Online Social Networks
Implementing Semantic Queries in Online Social NetworksImplementing Semantic Queries in Online Social Networks
Implementing Semantic Queries in Online Social Networks
 
Integrando a Web Social e a Web Semântica com PHP
Integrando a Web Social e a Web Semântica com PHPIntegrando a Web Social e a Web Semântica com PHP
Integrando a Web Social e a Web Semântica com PHP
 
Web Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebWeb Semântica, a terceira geração da Web
Web Semântica, a terceira geração da Web
 
Introdução ao Framework CakePHP
Introdução ao Framework CakePHPIntrodução ao Framework CakePHP
Introdução ao Framework CakePHP
 
Lógica Fuzzy aplicada à Sistemas de Apoio a Decisão
Lógica Fuzzy aplicada à  Sistemas de Apoio a DecisãoLógica Fuzzy aplicada à  Sistemas de Apoio a Decisão
Lógica Fuzzy aplicada à Sistemas de Apoio a Decisão
 
PHP: Atualidade e Tendências
PHP: Atualidade e TendênciasPHP: Atualidade e Tendências
PHP: Atualidade e Tendências
 
Fuzzy RDF in the Semantic Web: Deduction and Induction
Fuzzy RDF in the Semantic Web: Deduction and InductionFuzzy RDF in the Semantic Web: Deduction and Induction
Fuzzy RDF in the Semantic Web: Deduction and Induction
 
Desenvolvimento em três camadas com PHP 5, MVC e AJAX
Desenvolvimento em três camadas com PHP 5, MVC e AJAXDesenvolvimento em três camadas com PHP 5, MVC e AJAX
Desenvolvimento em três camadas com PHP 5, MVC e AJAX
 
Introdução à Google Maps API
Introdução à Google Maps APIIntrodução à Google Maps API
Introdução à Google Maps API
 
Introdução ao PHP Orientado a Objetos com Ajax
Introdução ao PHP Orientado a Objetos com AjaxIntrodução ao PHP Orientado a Objetos com Ajax
Introdução ao PHP Orientado a Objetos com Ajax
 
Padrões de Projeto Web e o MVC
Padrões de Projeto Web e o MVCPadrões de Projeto Web e o MVC
Padrões de Projeto Web e o MVC
 
Redes Neurais com PHP
Redes Neurais com PHPRedes Neurais com PHP
Redes Neurais com PHP
 
Introdução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPIntrodução às Redes Neurais com PHP
Introdução às Redes Neurais com PHP
 
Classe V: Educação à distância com Videoconferência no Moodle
Classe V: Educação à distância com Videoconferência no MoodleClasse V: Educação à distância com Videoconferência no Moodle
Classe V: Educação à distância com Videoconferência no Moodle
 

Abstração do banco de dados com PHP Doctrine

  • 1. abstração do banco de dados com PHP Doctrine Marcelo Akira – marcelo.akira@gmail.com Otávio Calaça – otaviocx@gmail.com Goiânia, 02 de outubro de 2009
  • 2. Grupo de Desenvolvedores PHP de Goiás  Criado em dezembro de 2007;  Lista de Discussão: − Mais 300 membros.  Encontros: − Palestras; − Networking.  Site: − www.gophp.com.br  Eventos: − FLISOL, FGSL, Latinoware, Conisli, CONSOFT, PHP Conference Brasil ...
  • 3. Abstração do banco de dados com PHP Doctrine Roteiro • O que é ORM? – Por que classes e não tabelas? • O que é Doctrine? – Models • Padrão Active Record – Principais Recursos • Arquivos YAML de Schema ● DQL • Data fixtures ● Listeners • Caching ● Behaviors • Exemplo Prático 3
  • 4. Abstração do banco de dados com PHP Doctrine O que é ORM? • Mapeamento Objeto-Relacional; • Ponte entre objetos e um BD Relacional; • Tabelas são representadas por Classes; • Registros por Objetos; • Relações são Associações; • Abstrai detalhes do SGBD (SQL e métodos nativos); 4
  • 5. Abstração do banco de dados com PHP Doctrine Por que classes e não tabelas? • Em uma linguagem orientada a objetos, como PHP, é mais fácil lidar com classes e objetos que com tabelas relacionais; • Classes possuem métodos que podem introduzir comportamentos às entidades (antes tabelas) do sistema. 5
  • 6. Abstração do banco de dados com PHP Doctrine O que é Doctrine? • Uma framework ORM para PHP; • Funciona com PHP 5.2.3+; • Inspirado no Hibernate (Java) e no ActiveRecord (Ruby on Rails); • Possui uma linguagem orientada a objetos em substituição ao SQL (DQL). 6
  • 7. Abstração do banco de dados com PHP Doctrine Mais sobre o Doctrine • Foi criado por 2006 por Konsta Vesterinen (Inativo); • Há um brasileiro participando no 'core team' (Guilherme Blanco); • A versão 1.0 foi lançada em Setembro de 2008; • É utilizado no framework Symphony; 7
  • 8. Abstração do banco de dados com PHP Doctrine Abstração de base de dados • Utiliza PDO (PHP Data Objects): uma implementação oficial do PHP para abstração de acesso a dados; • Banco de dados suportados: MySQL, PostgreSQL, Oracle, MS SQL, Firebird, etc. • A utilização de PDO diminui a dependência de Banco de Dados, aumentando a portabilidade de seu sistema; 8
  • 9. Abstração do banco de dados com PHP Doctrine Padrão ActiveRecord • O Doctrine implementa o padrão de projeto Active Record; • Este padrão foi definido por Martin Fowler, que mapeia tabelas como classes e linhas como objetos e define métodos de acesso; 9
  • 10. Abstração do banco de dados com PHP Doctrine Exemplo: Active Record class Funcionario { private $nome, $matricula, $salario ... public function salvar() ... public static function localizar($campo, $valor)... public function aumentarSalario( $percentual )... public function calcularFerias() .... ... } $f = Funcionario::localizar('matricula', '123'); $f.aumentarSalario( 1000 ); $f.salvar(); 10
  • 11. Abstração do banco de dados com PHP Doctrine Active Record: Models do Doctrine class User extends Doctrine_Record { public function setTableDefinition() { $this->hasColumn('username', 'string', 255, array( 'type' => 'string', 'length' => '255' ) ); $this->hasColumn('password', 'string', 255, array( 'type' => 'string', 'length' => '255' ) ); } public function setUp() { $this->hasMany('Group as Groups', array( 'refClass' => 'UserGroup', 'local' => 'user_id', 'foreign' => 'group_id' ) ); } } 11
  • 12. Abstração do banco de dados com PHP Doctrine Active Record: Models do Doctrine class Group extends Doctrine_Record { public function setTableDefinition() { $this->setTableName('groups'); $this->hasColumn('name', 'string', 255, array( 'type' => 'string', 'length' => '255' ) ); } public function setUp() { $this->hasMany('User as Users', array( 'refClass' => 'UserGroup', 'local' => 'group_id', 'foreign' => 'user_id' ) ); } } 12
  • 13. Abstração do banco de dados com PHP Doctrine Active Record: Models do Doctrine • Usando um model: $group = new Group(); $group1 = new Group(); $group->name = 'Palestrantes'; $group1->name = 'Palestrantes'; $user1 = new User(); $group2 = new Group(); $user1->username = 'otavio'; $group2->name = 'PHP'; $user1->password = '123456'; $user = new User(); $user2 = new User(); $user->username = 'otavio'; $user2->username = 'akira'; $user->password = '123456'; $user2->password = '654321'; $user->Groups[] = $group1; $user->Groups[] = $group2; $group->Users[] = $user1; $group->Users[] = $user2; $user->save(); $group->save(); 13
  • 14. Abstração do banco de dados com PHP Doctrine Onde começar? • Baixe o pacote Sandbox (caixa de areia) – http://www.doctrine-project.org/download • Siga a introdução My First Project (Meu primeiro Projeto), disponível em: – http://www.doctrine- project.org/documentation/cookbook/1_1/e n/my-first-project 14
  • 15. Abstração do banco de dados com PHP Doctrine Diretórios do Sandbox $ cd Doctrine­1.1.4­Sandbox $ ls config.php   – configuração do doctrine data/        ­ pasta para dados iniciais (fixture) doctrine     ­ utilitário de linha de comando doctrine.php – código­fonte do utilitário index.php    ­ um exemplo de arquivo inicial lib/    ­ bibliotecas do doctrine migrations/  ­ pasta para classes de migração models/      ­ pasta para arquivos de modelos schema/      ­ pasta para arquivos de estruturas 15
  • 16. Abstração do banco de dados com PHP Doctrine Configurando o Doctrine $ vi config.php define('SANDBOX_PATH', dirname(__FILE__)); define('DOCTRINE_PATH', SANDBOX_PATH . DIRECTORY_SEPARATOR . 'lib'); ... define vários outros caminhos ... // Configurar o DSN é importante para definir o BD define('DSN', 'mysql://root:123456@localhost/doctrine_testes'); ... outras configurações ... 16
  • 17. Abstração do banco de dados com PHP Doctrine Utilitário de linha de comando $ cd Doctrine­1.1.4­Sandbox $ ./doctrine ... ./doctrine create­tables – cria tabelas ./doctrine load­data – carrega dados inicial ./doctrine dql – executa dql ./doctrine generate­yaml­models – gera modelos ... vários outros comandos ... 17
  • 18. Abstração do banco de dados com PHP Doctrine Definindo estrutura com YAML 1/2 • Uma das formas de definir uma estrutura, é criando um arquivo schema.yml no diretório schema. 18
  • 19. Abstração do banco de dados com PHP Doctrine Definindo estrutura com YAML 2/2 ... continuação ... continuação User: Group: UserGroup:   columns:   tableName: groups   columns:     id:   columns:     user_id: integer(4)       primary: true     id:     group_id: integer(4)       autoincrement: true       primary: true   relations:       type: integer(4)       autoincrement: true    User:     username: string(255)       type: integer(4)       onDelete: CASCADE     password: string(255)     name: string(255)     Group:   relations:       onDelete: CASCADE     Groups:       class: Group       refClass: UserGroup       foreignAlias: aUsers Continua ... Continua ... 19
  • 20. Abstração do banco de dados com PHP Doctrine Gerando tabelas e modelos • Uma vez criado o arquivo .yml no diretório schema, você pode executar o comando seguinte para criar automaticamente a base de dados, as tabelas e as classes-modelos. $ ./doctrine build­all build­all ­ Generated models successfully from YAML schema build­all ­ Successfully created database for connection "doctrine"  named "doctrine_testes" build­all ­ Created tables successfully 20
  • 21. Abstração do banco de dados com PHP Doctrine Testando <?php Esse resultado abaixo é esperado, uma vez que a base require_once('config.php'); de dados está vazia. Doctrine::loadModels('models'); <pre> $query = new Doctrine_Query(); $query->from('User u, u.Groups g'); // resulta => Array ( $users = $query->execute(); ) </pre> echo '<pre>'; print_r($users->toArray(true)); echo '</pre>'; ?> 21
  • 22. Abstração do banco de dados com PHP Doctrine Utilizando fixture • Para popular dados no bd, pode-se criar um arquivo dados.yml em data/fixtures: User:   zyne:     username: zYne­     password: changeme     Groups: [founder, lead, documentation]   jwage:     username: jwage     password: changeme     Groups: [lead, documentation] Group:   founder:     name: Founder   lead:     name: Lead   documentation:     name: Documentation 22
  • 23. Abstração do banco de dados com PHP Doctrine Populando a base de dados • Pode-se carregar novamente as bases de dados e popular o BD: $ ./doctrine build­all­reload build­all­reload ­ Are you sure you wish to drop your databases?  (y/n) y build­all­reload ­ Successfully dropped database for connection  "doctrine" named "doctrine_testes" build­all­reload ­ Generated models successfully from YAML schema build­all­reload ­ Successfully created database for connection  "doctrine" named "doctrine_testes" build­all­reload ­ Created tables successfully build­all­reload ­ Data was successfully loaded 23
  • 24. Abstração do banco de dados com PHP Doctrine Testando novamente $ php index.php Array (     [0] => Array         (             [id] => 1             [username] => zYne­             [password] => changeme             [Groups] => Array                 (                     [0] => Array                         (                             [id] => 1                             [name] => Founder                         ) Dados do BD ... 24
  • 25. Abstração do banco de dados com PHP Doctrine Caching • Armazenar consultas em memória, não sendo necessário conectar no banco novamente para fazer a mesma consulta. • Memcache: $options = array(); $cacheDriver = new Doctrine_Cache_Memcache($options); • DB: $cacheConn = Doctrine_Manager::connection(new PDO('sqlite::memory:')); $cacheDriver = new Doctrine_Cache_Db(array('connection' => $cacheConn)); • APC: $cacheDriver = new Doctrine_Cache_Apc(); 25
  • 26. Abstração do banco de dados com PHP Doctrine Caching • Usando: $q = Doctrine_Query::create() ->from('Post p') ->leftJoin('p.Comentarios c') ->leftJoin('p.Tags t') ->useResultCache($cacheDriver); • Ou: $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE, $cacheDriver); $q = Doctrine_Query::create() ->from('Post p') ->leftJoin('p.Comentarios c') ->leftJoin('p.Tags t') ->useResultCache(true); 26
  • 27. Abstração do banco de dados com PHP Doctrine Doctrine Query Language • Consultas ao banco de dados usando orientação a objetos; • Gera SQLs complexas a partir de coisas simples; • Funções específicas do DB são suportadas. 27
  • 28. Abstração do banco de dados com PHP Doctrine Doctrine Query Language • DQL: • SQL: SELECT u.id AS u__id, u.is_active AS u__is_active, $q = Doctrine_Query::create() u.is_super_admin AS u__is_super_admin, u.first_name AS u__first_name, ->from('User u') u.last_name AS u__last_name, ->leftJoin('u.Phonenumbers p'); u.username AS u__username, u.password AS u__password, u.type AS u__type, u.created_at AS u__created_at, u.updated_at AS u__updated_at, p.id AS p__id, p.user_id AS p__user_id, p.phonenumber AS p__phonenumber FROM user u LEFT JOIN phonenumber p ON u.id = p.user_id 28
  • 29. Abstração do banco de dados com PHP Doctrine Listeners • O Doctrine possui listeners para transações, conexões, querys e records; • Exemplo: class User extends Doctrine_Record { // ... public function preInsert(Doctrine_Event $event) { $event->getInvoker()->created = date('Y-m-d', time()); $event->getInvoker()->updated = date('Y-m-d', time()); } public function preUpdate(Doctrine_Event $event) { $event->getInvoker()->updated = date('Y-m-d', time()); } } 29
  • 30. Abstração do banco de dados com PHP Doctrine Behaviors • Comportamentos; – Versionable; – Timestampable; – Sluggable; – I18n; – outros... 30
  • 31. Abstração do banco de dados com PHP Doctrine Behaviors • Exemplo: class User extends Doctrine_Record { // ... public function setUp() { // ... $this->actAs('Timestampable'); $this->actAs('Sluggable', array( 'unique' => true, 'fields' => array('titulo'), 'canUpdate' => true ) ); } } 31
  • 32. Abstração do banco de dados com PHP Doctrine Exemplo Prático 32
  • 33. Abstração do banco de dados com PHP Doctrine Referências • Site do Doctrine: http://www.doctrine-project.org • Padrão Active Record: http://pt.wikipedia.org/wiki/Active_record • Slides s/ Doctrine: http://www.slideshare.net/guilhermeblanco • PDO: http://br2.php.net/pdo • Manual do Doctrine: 33
  • 34. Abstração do banco de dados com PHP Doctrine FIM Perguntas? Marcelo Akira – marcelo.akira@gmail.com Otávio Calaça – otaviocx@gmail.com Obrigado! 34