SlideShare una empresa de Scribd logo
1 de 79
Bacharel em Informática com ênfase em Análise de Sistemas (Unisinos),
estudou na Universidade Técnica de Lisboa (Portugal), é Zend Certified
Engineer (PHP 5.3), Zend Certified PHP Engineer (PHP 5.5), Rogue
Wave Zend Certified Engineer 2017-PHP (PHP 7.1), Zend Framework 2
Certified Architect (ZFCA), Certified ScrumMaster pela Scrum Alliance,
Microsoft Certified Professional (MCP), idealizador do curso Certificamp,
autor do "Guia Preparatório para a Certificação PHP", consultor web e
PHP evangelist.
Atualmente é discente de pós-graduação em Computação Forense &
Perícia Digital, mantenedor do site www.perito.inf.br e criador do
TopTrumPHPs - SuperTrunfo de frameworks PHP www.toptrumphps.com.
Ari Stopassola Junior
Dummy
≠
Dumb
Passeios
Nome
Descrição
Preço
Distância
...
Objetos Base relacional
Nome Descrição Preço Distância
Classe Passeios Tabela Passeios
ORM
#SQN
Herança
Associação
Composição
Onde a parte é exclusiva do todo
Agregação
Onde a parte não é exclusiva do todo
Mapeamento Objeto Relacional (ORM)
• Persistir o objeto numa estrutura
de dados relacional
• Tradução para tabelas, campos,
linhas e relacionamentos
• Conversões de tipo
• ORM mascara detalhes obscuros
• Overhead
• Requer aprendizagem de outras
tencnologias. Ex.: DQL (Doctrine),
Propel, Eloquent etc.
http://www.edzynda.com/use-laravels-eloquent-orm-outside-of-laravel/
Capítulo 3:
A Self-Made ORM
Fontes: https://en.wikipedia.org/wiki/Object-relational_impedance_mismatch
http://blogs.tedneward.com/post/the-vietnam-of-computer-science
Impedance mismatch
Ferramentas de Object-relational mapping
Quem usa Doctrine?
GitHub Doctrine Propel
Commits 11.010 4.241
Branches 17 3
Releases 75 7
Contributors 537 148
Watch 317 85
Star 3.785 998
Fork 1.815 300
Extraídodia12/10/2017
Doctrine
Vantagens
• Estabilidade
• Comunidade
• Integração com os
principais frameworks
Desvantagens
•Curva de aprendizado
•Performance
• Object Relational Mapping (ORM)
• Database Abstraction Layer (DBAL)
• Common
• Annotations
• Collections
• Cache
• Inflector
• Lexer
Projetos correlacionados
https://github.com/guilhermeblanco
Roadmap
• Modelo de domínio
• Database Abstraction Layer (DBAL)
• Object Relational Mapping (ORM)
• Entities
• Entity manager
• Mapping
• Repositories
• Life cicle events
• Query Builder
• Caching
• Proxies
• Event subsystem
Fonte:https://flic.kr/p/UagSBp
composer require doctrine/orm
Auto-carregamento
{
"require": {
"doctrine/orm": "^2.5"
},
"autoload": {
"classmap": ["src/"]
}
}
composer dump
Mais informações em: https://getcomposer.org/doc/04-schema.md
Eloquent implementa Active Record
class Passeios extends Eloquent {
}
$passeio = Passeios::find(32);
$passeio->name = "Tour Uva e Vinho";
$passeio->save();
Fonte: http://www.martinfowler.com/eaaCatalog/activeRecord.html
Doctrine 2 implementa Data Mapper
Fonte: http://martinfowler.com/eaaCatalog/dataMapper.html
Data Mapper
• Camada de software que separa
objetos em memória do banco de
dados
• Sua responsabilidade é transmitir
dados entre ambos e isolar um do
outro
• Objetos desconhecem o esquema do
banco de dados, tão pouco usam
SQL
https://2013.nosql-matters.org/cgn/index.html%3Fp=2156.html
<?php
/**
* @Entity
* @Table(name="passeios")
*/
class Passeio
{
/**
* @Id
* @GeneratedValue(strategy="AUTO")
* @Column(type="integer")
*/
private $id;
/**
* @Column(type="string", length=255, nullable=true)
*/
private $nome;
}
Annotations
• Instruções declarativas dentro de blocos de documentação
• Doctrine usa anotações para definir o mapeamento objeto-
relacional
• Annotations são metadados que descrevem a entidade, como ela
deve ser armazenada, que tipo de colunas serão usadas etc.
• Inspirado no PHPDocumentor www.phpdoc.org
• Definida sempre acima do nome da classe e de cada atributo
• Entre /** xxx */ e começam com o simbolo @
/**
* Produto
*
* @Entity
* @Table(name="produtos")
*/
Anotações obrigatórias
"Learning Doctrine" by Doug Bierer (O'Reilly)
@Column(type="xxxx")
• smallint, integer, bigint
• decimal, float
• string, text, guid
• binary, blob, boolean
• date, date time, datetimez, time
• array, simple_array, json_array, object
http://doctrine-
dbal.readthedocs.io/en/latest/reference/types.html
Mapeandos os tipos de dados
Tipos do Doctrine Tipos SQL Tipos PHP
string VARCHAR string
integer INT integer
smallint SMALLINT integer
bigint BIGINT string
boolean BOOLEAN boolean
decimal DECIMAL double
date DATETIME DateTime
time TIME DateTime
datetime DATETIME/TIMESTAMP DateTime
text CLOB string
Entity Manager
$passeio = new Passeio;
$passeio->setName("Tour Itaimbezinho");
EntityManager::persist($passeio);
EntityManager::flush();
Entity Manager
$passeio = new Passeio;
$passeio->setName("Tour Itaimbezinho");
EntityManager::persist($passeio);
EntityManager::flush();
Fotohttps://www.flickr.com/photos/pragdave/173640462
Unit of Work
Fonte: http://martinfowler.com/eaaCatalog/unitOfWork.html
• Estratégia transactional write-behind
• Retarda a execução de cláusulas
SQL para executá-las
posteriormente de forma mais
eficiente
• Executa numa ordem tal de modo a
liberar o mais rápido possível as
tabelas em questão (write locks), ao
fim da transação
Herança
Herança: estratégia single table
/**
* @Entity
* @Table(name="pessoas")
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="diferencia", type="string")
* @DiscriminatorMap({"pessoa"="Pessoa","autor"="Autor","editor"="Editor"})
*/
class Pessoa { ... }
/**
* @Entity
*/
class Editor extends Pessoa { ... }
/**
* @Entity
*/
class Autor extends Pessoa { ... }
Herança: estratégia single table
Herança: estratégia Single Table
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person"="Usuario","employee"="Colaborador"})
*/
Revistaphp|architect,ediçãomarço/2016.
Herança: estratégia Class Table
Id
Email
Senha
Nome
Distingue
Pessoa
Id
Curriculo
Participacao
Autor
Id
Especialidade
Editor
Herança: Class Table
/**
* @Entity
* @Table(name="pessoa")
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="distingue", type="string")
* @DiscriminatorMap({"comum"="Pessoa","autor"="Autor","editor"="Editor"})
*/
class Pessoa
Hidratação
$produto = $entityManager->find('Produto', 5);
Workflow
1) Crie as entidades com suas respectivas annotations
2) Implemente o cli-config.php (na raiz do projeto) que chama o
bootstrap.php – de acordo com o exemplo a seguir
3) Realize a varredura nas annotations e crie as respectivas tabelas:
vendor/bin/doctrine orm:schema-tool:create
• Verifique incoerências das classes mediante o BD:
vendor/bin/doctrine orm:validate-schema
• vendor/bin/doctrine orm:schema-tool:update --force
<?php
require_once "vendor/autoload.php";
use DoctrineORMToolsSetup;
use DoctrineORMEntityManager;
$config = Setup::createAnnotationMetadataConfiguration(array("./src"));
//Configura a base de dados
$conexao = array(
'driver' => 'pdo_mysql',
'host' => 'localhost',
'dbname' => 'tutorial-doctrine',
'user’ => 'root',
'password' => 'root'
);
//Disponibiliza o EntityManager
$entityManager = EntityManager::create($conexao, $config);
bootstrap.php
cli-config.php
<?php
require_once "bootstrap.php";
//Precisamos prover ao entityManager uma interface via linha de comando
//A interface CLI nos permite interagir com o banco de dados como, por exemplo
//criar e atualizar esquemas de BD
return DoctrineORMToolsConsoleConsoleRunner::createHelperSet($entityManager);
Livro
http://leanpub.com/certificacaophp
Modelo de domínio
Relacionamentos
Fonte:https://flic.kr/p/jagpmg
Hóspede
$id
$nome
Hóspede
$id
$nome
Hotel
$id
$hospedes[]
Hóspede
$id
$hotel
Owning side Inverse side
/**
* @OneToMany(targetEntity="Hospede", mappedBy="hotel")
*/
protected $hospedes;
Relação 1:N (um-para-ene)
“Um hotel hospeda vários hóspedes”
/**
* um usuário:muitas correções
* @OneToMany(targetEntity="Correcao", mappedBy="usuario")
*/
private $correcoes;
class Usuario
{
/**
* @Id
* @GeneratedValue
* @Column(type="bigint")
*/
private $id;
/**
* @Column(name="email", type="string", length=255, nullable=false)
*/
private $email;
/**
* @Column(name="senha", type="string", length=255, nullable=false)
*/
private $senha;
/**
* @Column(name="nome", type="string", length=255)
*/
private $nome;
vendor/bin/doctrine orm:validate-schema
vendor/bin/doctrine orm:schema-tool:create
usuarioscorrecoes
use DoctrineCommonCollectionsArrayCollection;
...
public function __construct()
{
parent::__construct();
$this->correcoes = new ArrayCollection();
}
public function setCorrecoes($correcao)
{
$this->correcoes[] = $correcao;
}
Classe: usuario
Relação 1:1 (lê-se um-para-um)
“cada colaborador trabalha para uma empresa parceira”
Colaborador
$id
$parceiro
Parceiro
$id
Owning side Inverse side
/**
* @OneToOne(targetEntity="Parceiro")
* @JoinColumn(name="parceiro", referencedColumnName="id")
*/
protected $parceiro;
id nome preco duracao
1 Tour Uva e Vinho 99 12
2 Noite Gaúcha 110 4
3 Alpen Park 30 3
4 Canyon Itaimbezinho 99 10
5 Parques de Gramado 35 5
pacotes_id passeios_id
1 1
1 2
2 3
2 4
3 3
4 1
4 5
Passeios
Relação N:M (ene-para-eme)
“Pacotes têm passeios e o mesmo passeio compõe vários pacotes”
id nome
1 Serra Gaúcha Tradicional
2 Aventura
3 Serra com as Crianças
4 Italiana e Alemã
Pacotes
Pacote
$id
$passeios[]
Pacote
$id
$passeios[]
Hóspede
$id
$nome
Hóspede
$id
$nome
Pacote
$id
$passeios[]
Passeio
$id
$pacotes[]
Owning side Inverse side
/**
* @ManyToMany(targetEntity="Passeio", mappedBy="pacotes")
* @JoinTable(name="pacotes_has_passeios",
* joinColumns={@JoinColumn(name="pacotes_id", "id")},
* inverseJoinColumns={@JoinColumn(name="passeios_id", "id")})
*/
protected $passeios;
Relação N:M (ene-para-eme)
“Pacotes têm passeios e o mesmo passeio compõe vários pacotes”
N:M
Pacote
$id
$passeios[]
Pacote
$id
$passeios[]
Hóspede
$id
$nome
Hóspede
$id
$nome
Usuário
$id
$livros[]
Livro
$id
$usuarios[]
Owning side Inverse side
/**
* Muitos usuário:muitos livros
* @ManyToMany(targetEntity="Livro", mappedBy="usuarios")
*/
private $livros;
Identifica a coluna no
inverse side que
referencia de volta o
owning side
N:M
Pacote
$id
$passeios[]
Pacote
$id
$passeios[]
Hóspede
$id
$nome
Hóspede
$id
$nome
Usuário
$id
$livros[]
Livro
$id
$usuarios[]
Owning side Inverse side
/**
* Muitos livros:muitos usuários
* @ManyToMany(targetEntity="Usuario", inversedBy="livros")
*/
private $usuarios;
usuarioscorrecoeslivros
livro_usuario
Criação
automática do
schema...
Relações
•One-to-one
•One-to-many
•Many-to-many
 Unidirecional
 Bidirecional
 Self-
Referencing
Lifecycle Events
Lifecycle Events: eventos
• preRemove e postRemove
• prePersist e postPersist
• preUpdate e postUpdate
• postLoad
• preFlush, onFlush e postFlush
Fonte: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html
/**
* @Entity
* @HasLifecycleCallbacks
* @Table(name="usuarios")
*/
class Usuario
{
/** @PrePersist */
public function geraSenhaRandomica()
{
for($i = 1; $i <= 6; $i++) {
$this->senha .= chr(rand(65, 90)); //65 -> A, 90 -> Z
}
}
Fonte: http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/introduction.html
PDO x DBAL
Data-access Layer
• Permite a troca de banco de
dados utilizando as mesmas
chamadas de métodos
• Não reescreve SQL
• Tão pouco emula
funcionalidades inexistentes
Database Abstraction Layer
• Agnóstico
• Manipulação por meio de uma
API Orientada à Objetos
• Traz maior consistência na
manipulação do BD
• Doctrine usa DBAL, mas você
pode usar DBAL sem Doctrine
• DBAL utiliza PDO internamente
ExemplodeDBAL
<?php
include __DIR__ . '/doctrine_autoloader.php';
use DoctrineDBALConfiguration;
use DoctrineDBALDriverManager;
//Obtém a conexão
$dbParams = include __DIR__ . '/database.params.php';
$conn = DriverManager::getConnection($dbParams, new Configuration());
$sql = "SELECT * FROM orcamentos WHERE sobrenome = ?";
$stmt = $conn->prepare($sql);
$stmt->execute(array('STOPASSOLA'));
//OU utilizando QueryBuilder
$qb = $conn->createQueryBuilder();
$qb->select('*')->from('orcamentos')->where('sobrenome = :name');
$data = array(':name' => 'STOPASSOLA');
while ($tupla = $stmt->fetch()) {
var_dump($tupla);
}
Namespaces
//Cria um novo livro
$livro = new PublicacoesLivro();
$livro->setNome("Guia preparatório para a Certificação PHP");
$livro->setEdicao(1);
//Persiste no banco de dados
$entityManager->persist($livro);
$entityManager->flush();
Repository Pattern
//Obtem TODOS os livros com o método findAll
//Obs.: uso do namespace é imprescindível
$livros = $em->getRepository('PublicacoesLivro')->findAll();
echo "<strong>Listando todos os livros</strong><br>";
foreach($livros as $livro){
echo $livro->getNome()."<br>";
}
Instância de
EntityManager Fonte: https://tommcfarlin.com/repository-pattern-benefits/
Repository: find()
$livro = $em->getRepository('PublicacoesLivro')->find(1);
echo $livro->getNome();
Busca pelo ID
Busca por critério
$livros = $em->getRepository('Livro')->findBy(array('edicao' => 1), array('nome' => 'ASC'));
$livro = $em->getRepository('Livro')->findOneBy(array('isbn' => '978-1-4842-2558-5'));
$livro = $em->getRepository('Livro')->findOneByIsbn('978-1-4842-2558-5');
Magic finders
Doctrine Query Language – DQL
$query = EntityManager::createQuery("select p from
VendaBalcaoEntitiesPasseios p where p.preco >= 90
AND p.preco <= 150");
$passeios = $query->getResult();
Delete
$livro = $em->getRepository('PublicacoesLivro')->find(27);
$em->remove($livro);
$em->flush();
$livro = $em->find('PublicacoesLivro', 27);
$em->remove($livro);
$em->flush();
SHOW ME THE CODE!
https://github.com/stopassola/doctrine_lab
Lab: https://github.com/stopassola/doctrine_lab
Referências
DUAS cortesias
https://leanpub.com/doctrine-na-pratica
E-mail:
arijunior@gmail.com
Twitter: @stopassola
Skype: stopassola
LinkedIn:
http://pt.linkedin.com/in/stopassola
Facebook:
http://www.facebook.com/arijunior
Sites:
http://slideshare.net/arijunior
http://www.perito.inf.br
http://www.certificamp.com
http://www.rumoacertificacaophp.com
Contatos

Más contenido relacionado

La actualidad más candente

Jason: Componentes personalizados
Jason: Componentes personalizados Jason: Componentes personalizados
Jason: Componentes personalizados
Nécio de Lima Veras
 
Sistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBSistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJB
Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Adriano Teixeira de Souza
 

La actualidad más candente (20)

Web app flaws
Web app flawsWeb app flaws
Web app flaws
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 
J530 14 xdoclet
J530 14 xdocletJ530 14 xdoclet
J530 14 xdoclet
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
Hibernate-consultas
Hibernate-consultasHibernate-consultas
Hibernate-consultas
 
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
 
Paradigma Orientado a Objeto
Paradigma Orientado a ObjetoParadigma Orientado a Objeto
Paradigma Orientado a Objeto
 
Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a Objetos
 
Web App Flaws - SQL Injection
Web App Flaws - SQL InjectionWeb App Flaws - SQL Injection
Web App Flaws - SQL Injection
 
Linguagem Java - Conceitos e Técnicas
Linguagem Java - Conceitos e TécnicasLinguagem Java - Conceitos e Técnicas
Linguagem Java - Conceitos e Técnicas
 
Java 08
Java 08Java 08
Java 08
 
Jason: Componentes personalizados
Jason: Componentes personalizados Jason: Componentes personalizados
Jason: Componentes personalizados
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Sistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBSistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJB
 
Modulos SNEP
Modulos SNEPModulos SNEP
Modulos SNEP
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
Poo padadigmas
Poo padadigmasPoo padadigmas
Poo padadigmas
 
A arquitetura modular do Java 9
A arquitetura modular do Java 9A arquitetura modular do Java 9
A arquitetura modular do Java 9
 

Similar a Doctrine for dummies

Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 

Similar a Doctrine for dummies (20)

Doctrine for Dummies
Doctrine for DummiesDoctrine for Dummies
Doctrine for Dummies
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Jj08 otimizacao
Jj08 otimizacaoJj08 otimizacao
Jj08 otimizacao
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
Migrando para o PHP 5
Migrando para o PHP 5Migrando para o PHP 5
Migrando para o PHP 5
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Terraform.pptx
Terraform.pptxTerraform.pptx
Terraform.pptx
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Sapo Sessions PHP
Sapo Sessions PHPSapo Sessions PHP
Sapo Sessions PHP
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
PHP MySQL Aula 07
PHP MySQL Aula 07PHP MySQL Aula 07
PHP MySQL Aula 07
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Novidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiNovidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por ai
 
Terraform.pdf
Terraform.pdfTerraform.pdf
Terraform.pdf
 

Más de Ari Stopassola Junior

Más de Ari Stopassola Junior (8)

PHP Community Spirit
PHP Community SpiritPHP Community Spirit
PHP Community Spirit
 
DevOps: desenvolvedores e sysadmins cooperando na prática
DevOps: desenvolvedores e sysadmins cooperando na práticaDevOps: desenvolvedores e sysadmins cooperando na prática
DevOps: desenvolvedores e sysadmins cooperando na prática
 
Rumo à Certificação PHP
Rumo à Certificação PHPRumo à Certificação PHP
Rumo à Certificação PHP
 
Ti na Stopassola Advocacia
Ti na Stopassola AdvocaciaTi na Stopassola Advocacia
Ti na Stopassola Advocacia
 
Workshop Magento
Workshop MagentoWorkshop Magento
Workshop Magento
 
Typo3 - instalação e template
Typo3 - instalação e templateTypo3 - instalação e template
Typo3 - instalação e template
 
Missao Portugal
Missao PortugalMissao Portugal
Missao Portugal
 
Treinamento PHP: Strings & Patterns
Treinamento PHP: Strings & PatternsTreinamento PHP: Strings & Patterns
Treinamento PHP: Strings & Patterns
 

Doctrine for dummies

Notas del editor

  1. Inspirado na JSR-317 Hibernate. Não resolve problemas automaticamente.
  2. E como ficam as agregações, composições de objetos?
  3. Relação todo parte. A crítica é exclusiva de um livro, então haverá uma chave estrangeira em Crítica (livro_id, por exemplo).
  4. As partes não são exclusivas do todo. Ex.: Livro (todo) e autor (parte), embora o autor possa ter escrito outros livros. Será necessário criar uma tabela associativa intermediária.
  5. Reduzir a impedância. Experimente fazer um left outer join num ORM, ou uma função de agregação como média. Alguns falharam ao executar transações, passando a responsabilidade para a aplicação. Não há necessidade de cache, pois o mongoDB já fica em memório – o quanto houver de RAM disponível. Usar monboDB simplifica o desenvolvimento da aplicação pois não requer tratar de atualizações de registros, cache expirado etc.
  6. Conceitualmente objetos formam grafos, enquanto que o banco relacional é tabular.
  7. Hibernate do Java e ao ActiveRecord do Rails. Mapeamento em arquivos .ini ou XML Propel e Doctrine usam o design pattern ActiveRecord, enquanto que o Zend_Db_Table usa Table Data Gateway pattern e Row Data Gateway pattern. Livro "Patterns of Enterprise Application Architecture" do Martin Fowler de 2003. CakePHP Doctrine é a mais popular. Não serve para estruturas dinâmicas como MongoDB, por exemplo.
  8. https://github.com/doctrine/doctrine2 https://github.com/propelorm/Propel2 Quem usa Symfony, automaticamente usa Doctrine.
  9. Suporta também os mais variados sistemas gerenciadores de banco de dados, sejam eles relacionais ou NoSQL. Grupo de bibliotecas orientadas a persistência.
  10. Top 5 contributors do projeto: https://github.com/doctrine/doctrine2/graphs/contributors
  11. Inspirado no Hibernate do Java
  12. O Doctrine é uma coleção de sub-projetos como, por exemplo, DBAL, cache, Annotations etc.
  13. Generating autoload files
  14. Herda toda a lógica de persistência do ORM, gerando overhead.
  15. Pode-se utilizar YAML, XML e o próprio PHP.
  16. Annotations são metadados que descrevem a entidade, como ela deve ser armazenada, tipo de colunas serão usadas etc.
  17. @Entity identifica a classe como uma entidade para o EntityManager @Table informa o nome da tabela, embora seja dispensável caso a tabela tenha o mesmo nome da classe. @Column identifica uma propriedade do objeto como um campo da tabela. Podem haver outras propriedades que não sejam mapeadas. Se o nome for diferente, usa-se o atributo ”name”. Caso o nome do campo mude na tabela, basta apontar na annotation da respectiva classe É um componente muito utilizado em outros projetos, além do Doctrine.
  18. Mecanismo que lida com a persistência dos objetos. É a implementação do design pattern ”Data Mapper” Registrar uma entidade.
  19. Mecanismo que lida com a persistência dos objetos.
  20. Executa quando ocorre o flush. Útil para quem utiliza Testes unitários, onde os testes são feitos encapsulados em uma transação e depois desfeitos no fim – de modo a não alterar o BD. Cada insert, se único, será encapsulado numa transação.
  21. Mapped Superclasses TABLE_PER_CLASS
  22. orm:schema-tool:update --dump-sql mostra a query que deverá ser executada no BD para alinhar com as classes registradas (entidades) [Database] FAIL - The database schema is not in sync with the current mapping file.
  23. Sem esse arquivo, não conseguimos executar comandos como: vendor/bin/doctrine orm:validate-schema vendor/bin/doctrine orm:schema-tool:create
  24. Entities representam o domínio, o problema que está se solucionando. Define-o primeiro, depois defina o DB, Ocramius: ”o banco serve apenas para guardar coisas”. Após modelar o problema, a solução vem automaticamente (com um pouquinho de esforço, é claro)
  25. Uma e somente uma… @var é uma anotação do DocBlock ignorada pelo Doctrine, utilizada para completar código nas IDEs
  26. Uma e somente uma…
  27. Uma e somente uma…
  28. mappedBy é utilizado apenas no "owning side"
  29. Instala também o Doctrine Commons. PDO abstrai o acesso aos dados e não propriamente o banco de dados, pois não reescreve SQL, tão pouco emula recursos ausentes em determinado BD. Ou seja: diretivas SQL específicas não são traduzidas.
  30. Evita utilizar um ”dialeto” SQL específico de cada banco. Não que necessariamente o BD será trocado o tempo todo, mas traz maior consistência. Esconde detalhes de cada banco. Ex.: PostreSQL CREATE SEQUENCE serial; SELECT nextval('serial'); JSON em BD também é um recurso interessantíssimo do PostgreSQL Padroniza o acesso via OO. Conexão via DBAL é semelhante ao que seria feito através de PDO. Inclusive os nomes dos métodos são semelhantes, para diminuir a curva de aprendizado. Usa interface fluente. Ex.: $obj->metodoA()->metodoB()->metodoC();
  31. Usa ”fluent interface”, termo cunhado por Eric Evans and Martin Fowler em 2005.
  32. Inspirado do Hibernate do Java (HQL), é um ”dialeto” de SQL orientado à objetos. Mais controle sobre as querys. Pensar nas consultas sob o ponto de vista de objetos ao invés de relacionamentos. Ver Expression. As consultas trazem objetos.
  33. http://laravel.com/docs/4.2/eloquent#eager-loading
  34. Frase de Linus Torvalds
  35. entregar adesivos!