• Save
Abstração do banco de dados com PHP Doctrine
Upcoming SlideShare
Loading in...5
×
 

Abstração do banco de dados com PHP Doctrine

on

  • 9,650 views

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.

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.

Statistics

Views

Total Views
9,650
Views on SlideShare
9,630
Embed Views
20

Actions

Likes
5
Downloads
0
Comments
0

2 Embeds 20

http://www.slideshare.net 18
https://twitter.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Abstração do banco de dados com PHP Doctrine Abstração do banco de dados com PHP Doctrine Presentation Transcript

  • 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