abstração do banco de dados com

                      PHP Doctrine



Marcelo Akira – marcelo.akira@gmail.com
    Otávio ...
Grupo de Desenvolvedores
           PHP de Goiás
   Criado em dezembro de 2007;
   Lista de Discussão:
     −   Mais 300...
Abstração do banco de dados
               com PHP Doctrine


                       Roteiro
• O que é ORM?
  – Por que cl...
Abstração do banco de dados
               com PHP Doctrine


              O que é ORM?
•   Mapeamento Objeto-Relacional;...
Abstração do banco de dados
             com PHP Doctrine


 Por que classes e não tabelas?

• Em uma linguagem orientada ...
Abstração do banco de dados
             com PHP Doctrine


         O que é Doctrine?

• Uma framework ORM para PHP;
• Fu...
Abstração do banco de dados
             com PHP Doctrine


       Mais sobre o Doctrine
• Foi criado por 2006 por Konsta ...
Abstração do banco de dados
             com PHP Doctrine


  Abstração de base de dados
• Utiliza PDO (PHP Data Objects):...
Abstração do banco de dados
             com PHP Doctrine


        Padrão ActiveRecord

• O Doctrine implementa o padrão ...
Abstração do banco de dados
               com PHP Doctrine


       Exemplo: Active Record
class Funcionario {
  private ...
Abstração do banco de dados
                 com PHP Doctrine

Active Record: Models do Doctrine
class User extends Doctri...
Abstração do banco de dados
                 com PHP Doctrine

Active Record: Models do Doctrine
class Group extends Doctr...
Abstração do banco de dados
               com PHP Doctrine

Active Record: Models do Doctrine
• Usando um model:
        ...
Abstração do banco de dados
             com PHP Doctrine


           Onde começar?
• Baixe o pacote Sandbox (caixa de ar...
Abstração do banco de dados
               com PHP Doctrine


        Diretórios do Sandbox
$ cd Doctrine­1.1.4­Sandbox
$ ...
Abstração do banco de dados
                  com PHP Doctrine


         Configurando o Doctrine
$ vi config.php
define('...
Abstração do banco de dados
               com PHP Doctrine


  Utilitário de linha de comando
$ cd Doctrine­1.1.4­Sandbox...
Abstração do banco de dados
             com PHP Doctrine

Definindo estrutura com YAML 1/2


• Uma das formas de definir ...
Abstração do banco de dados
                       com PHP Doctrine

     Definindo estrutura com YAML 2/2
               ...
Abstração do banco de dados
                  com PHP Doctrine


     Gerando tabelas e modelos
• Uma vez criado o arquivo...
Abstração do banco de dados
                       com PHP Doctrine


                                  Testando
<?php    ...
Abstração do banco de dados
                   com PHP Doctrine


                   Utilizando fixture
• Para popular dad...
Abstração do banco de dados
                  com PHP Doctrine


     Populando a base de dados
• Pode-se carregar novamen...
Abstração do banco de dados
                 com PHP Doctrine


            Testando novamente
$ php index.php
Array
(
   ...
Abstração do banco de dados
              com PHP Doctrine


                       Caching
• Armazenar consultas em memór...
Abstração do banco de dados
                com PHP Doctrine


                          Caching
• Usando:
               ...
Abstração do banco de dados
           com PHP Doctrine


   Doctrine Query Language

• Consultas ao banco de dados usando...
Abstração do banco de dados
                 com PHP Doctrine


      Doctrine Query Language

• DQL:                     ...
Abstração do banco de dados
              com PHP Doctrine


                      Listeners
• O Doctrine possui listeners...
Abstração do banco de dados
             com PHP Doctrine


                Behaviors

• Comportamentos;
    –   Versionab...
Abstração do banco de dados
              com PHP Doctrine


                     Behaviors

• Exemplo:
 class User extend...
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 Doctrin...
Abstração do banco de dados
        com PHP Doctrine


                FIM

          Perguntas?

Marcelo Akira – marcelo....
Upcoming SlideShare
Loading in …5
×

Abstração do banco de dados com PHP Doctrine

8,146 views
8,067 views

Published on

Palestra ministrada por mim e pelo Marcelo Akira no VI Forum Goiano de Software Livre. Aborda o que é ORM e como utilizar Doctrine para abstrair a camada de dados da sua aplicação.

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,146
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Abstração do banco de dados com PHP Doctrine

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 30. Abstração do banco de dados com PHP Doctrine Behaviors • Comportamentos; – Versionable; – Timestampable; – Sluggable; – I18n; – outros... 30
  31. 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. 32. Abstração do banco de dados com PHP Doctrine Exemplo Prático 32
  33. 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. 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

×