ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
Doctrine 2.0: A evolução da persistência em PHP
1. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine 2.0
A evolução da persistência em PHP
PHP Conference Brazil 2009 www.doctrine-project.org
2. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Guilherme Blanco
• Desenvolvedor há 10+ anos
• Evangelista de projetos OS
• Trabalhar para Naspers/MIH
• Contribui para...
• ...Doctrine
• ...Zend Framework
• ...Symfony
• ...PHP
• ...etc
PHP Conference Brazil 2009 www.doctrine-project.org
3. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Guilherme Blanco
• http://www.twitter.com/guilhermeblanco
• http://www.facebook.com/guilhermeblanco
Versão modificada da apresentada na ZendCon UnCon 2009.
Esta apresentação é a tradução da palestra apresentada por
Jonathan Wage no Big LAMP Camp 2009 em Nashville, TN.
PHP Conference Brazil 2009 www.doctrine-project.org
4. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O que estão falando por aí?
• “Quanto mais eu uso Doctrine, mais e mais eu imagino como
consegui viver até hoje sem ele” - @sidhighwind
• “PHP 5.3.1 lançado hoje. Queria que Cpanel integrasse no
EasyApache. Quero namespaces e Doctrine 2!” - @diffkid
• “Fazendo meu primeiro site com Symfony e Doctrine. Mais
fácil que imaginei!” - @timbowler
• “Implementado Doctrine ORM com sucesso no Zend
Framework para meu próximo projeto. Está demais!” -
@otobrglez
• http://twitter.com/#search?q=%23doctrine
PHP Conference Brazil 2009 www.doctrine-project.org
5. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Quantos já usaram Doctrine?
• Pre 1.0?
• 1.0?
• 1.1?
• 1.2?
• 2.0?
PHP Conference Brazil 2009 www.doctrine-project.org
6. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine 1.0
• Primeiro commit em 13 de Abril de 2006
• Concluído e lançado em 1 de Setembro de 2008
• Uma das 1as. implementações de ORM para PHP
• Primeiro lançamento LTS (Long Term Support).
Mantido até 1 de Março de 2010
• Integra-se com frameworks populares: Symfony,
Zend Framework, Code Igniter, etc.
PHP Conference Brazil 2009 www.doctrine-project.org
7. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine 1.1
• Evolução continuada da 1.0
• Dezenas de pequenas melhorias
• Novos recursos significantes
• Bug fixes? Impossível contabilizar...
PHP Conference Brazil 2009 www.doctrine-project.org
8. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine 1.2
• Último lançamento LTS da versão 1.x
• Mais e mais bug fixes
• Mais melhorias
• Dezenas de novos recursos
• Lançamento em 2 semanas!!!
PHP Conference Brazil 2009 www.doctrine-project.org
9. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine 2.0
PHP Conference Brazil 2009 www.doctrine-project.org
10. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Compatível com PHP 5.3.0+
PHP Conference Brazil 2009 www.doctrine-project.org
11. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Três principais pacotes
PHP Conference Brazil 2009 www.doctrine-project.org
12. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Common
PHP Conference Brazil 2009 www.doctrine-project.org
13. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
DBAL
PHP Conference Brazil 2009 www.doctrine-project.org
14. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
ORM
PHP Conference Brazil 2009 www.doctrine-project.org
15. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Implementado integralmente usando namespaces
PHP Conference Brazil 2009 www.doctrine-project.org
16. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Código em Namespace
namespace DoctrineORM;
use DoctrineORMQueryExpr,
DoctrineCommonDoctrineException;
/**
* This class is responsible for building DQL query strings via an object oriented
* PHP interface.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.org
* @since 2.0
* @version $Revision$
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
*/
class QueryBuilder
{
PHP Conference Brazil 2009 www.doctrine-project.org
17. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Usando Namespaces
use DoctrineORMQueryBuilder;
$qb = new QueryBuilder($em);
$qb->select('u')
->from('ModelsUser', 'u')
->orderBy('u.username', 'ASC');
$q = $qb->getQuery();
$users = $q->execute();
PHP Conference Brazil 2009 www.doctrine-project.org
18. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Acompanha os padrões de
interoperabilidade técnica do PHP 5.3
PSR = PHP Standards Recommendation
http://tr.im/psr_0
PHP Conference Brazil 2009 www.doctrine-project.org
19. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O que isso significa?
• Bibliotecas PHP finalmente serão 100% interoperáveis,
com a melhor performance possível de carga
• Symfony, Doctrine, Zend Framework, PEAR2/Pyrus,
Typo3, Lithium, Flow3, Solar, Agavi, etc.
• Carregue classes de 3 bibliotecas diferentes com um
único autoloader e um único include path
• Compartilhe a implementação da SplClassLoader!
http://gist.github.com/221634
• Interessados em implementar SplClassLoader em C ??? =)
PHP Conference Brazil 2009 www.doctrine-project.org
20. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Performance do PHP 5.3
PHP Conference Brazil 2009 www.doctrine-project.org
21. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine 1 e 2 possuem aumento
de performance significativos
com o PHP 5.3
PHP Conference Brazil 2009 www.doctrine-project.org
22. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
-30% Consumo de Memória
PHP Conference Brazil 2009 www.doctrine-project.org
23. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
+20% Rapidez
PHP Conference Brazil 2009 www.doctrine-project.org
24. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Qual é o meu ponto de vista?
USE PHP 5.3!
PHP Conference Brazil 2009 www.doctrine-project.org
25. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Números falam por si só
Doctrine 1.1
4.3 s para 5000 registros
Doctrine 2.0
1.4 s para 5000 registros
Doctrine 2.0
3.5 s para 10000 registros
PHP Conference Brazil 2009 www.doctrine-project.org
26. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine 2 é RÁPIDO!
PHP Conference Brazil 2009 www.doctrine-project.org
27. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O código não é tão
ruim aos olhos
PHP Conference Brazil 2009 www.doctrine-project.org
28. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Chega de impôr dados no meu
modelo de domínio!!!
PHP Conference Brazil 2009 www.doctrine-project.org
29. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O jeito Doctrine 1.X
class User extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('id', 'integer', null, array(
'primary' => true,
'auto_increment' => true
));
$this->hasColumn('username', 'string', 255);
}
}
PHP Conference Brazil 2009 www.doctrine-project.org
30. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Qual é o problema?
• Pfff... Requer extender Doctrine_Record
• Impõe métodos, propriedades e mais lixo
nos nossos objetos de domínio
• Necessário instanciar um objeto “burro”
User para obter metadados do modelo
• LenTU...feIU i sImPLeSMENti xXxATu!!!!! =P
PHP Conference Brazil 2009 www.doctrine-project.org
31. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O novo jeito Doctrine 2
Especifique as informações de mapeamento using
doc block Annotations, YAML, XML ou PHP.
PHP Conference Brazil 2009 www.doctrine-project.org
32. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Com Annotations
/**
* @Entity
* @Table(name="user")
*/
class User
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="auto")
*/
public $id;
/**
* @Column(type="string", length=255)
*/
public $username;
}
PHP Conference Brazil 2009 www.doctrine-project.org
33. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Com YAML
EntitiesUser:
type: entity
table: users
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
name:
type: string(50)
PHP Conference Brazil 2009 www.doctrine-project.org
34. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Com XML
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xsi="http://
www.w3.org/2001/XMLSchema-instance" schemaLocation="http://doctrine-project.org/schemas/orm/
doctrine-mapping.xsd">
<entity name="EntitiesUser" table="users">
<field name="name" type="string" column="name" length="50" precision="0" scale="0">
<options/>
</field>
<id name="id" type="integer" column="id">
<generator strategy="AUTO"/>
</id>
</entity>
</doctrine-mapping>
PHP Conference Brazil 2009 www.doctrine-project.org
35. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Com PHP
use DoctrineORMMappingClassMetadataInfo;
$metadata->setInheritanceType(ClassMetadataInfo::INHERITANCE_TYPE_NONE);
$metadata->setPrimaryTable(array(
'name' => 'users',
));
$metadata->mapField(array(
'fieldName' => 'id',
'type' => 'integer',
'id' => true,
'columnName' => 'id',
));
$metadata->mapField(array(
'fieldName' => 'name',
'type' => 'string',
'length' => '50',
'columnName' => 'name',
));
$metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO);
PHP Conference Brazil 2009 www.doctrine-project.org
36. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Sem a necessidade de extender a classe Base...
$user = new EntitiesUser();
$user->setUsername('jwage');
print_r($user);
User Object
(
[id] =>
[username] => jwage
)
...significa modelo de domínio limpo!
PHP Conference Brazil 2009 www.doctrine-project.org
37. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine 2 é quase integralmente
desacoplado. Você pode utilizar
recursos individualmente
PHP Conference Brazil 2009 www.doctrine-project.org
38. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Use a DBAL sem a ORM!
PHP Conference Brazil 2009 www.doctrine-project.org
39. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Database Abstraction Layer
• A DBAL é um projeto poderoso por si só
• Baseada em código de outros projetos:
– PEAR MDB2
– Zend_Db
PHP Conference Brazil 2009 www.doctrine-project.org
40. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Database Abstraction Layer
• Utilizar a Doctrine DBAL sozinha é uma boa
opção para projetos PHP se uma ORM
completa não é necessária
• API para executar queries, alterações no
schema, etc.
• Conecta-se com diferentes tipos de bases
de dados: mysql, sqlite, pgsql, oracle, etc.
PHP Conference Brazil 2009 www.doctrine-project.org
41. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Examplos de uso da DBAL
PHP Conference Brazil 2009 www.doctrine-project.org
42. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Criando conexão com o MySQL
$params = array(
'driver' => 'pdo_mysql',
'host' => 'localhost',
'user' => 'root',
'password' => '',
'dbname' => 'doctrine2dbal'
);
$conn = DoctrineDBALDriverManager::getConnection($params);
PHP Conference Brazil 2009 www.doctrine-project.org
43. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Obtendo o Schema Manager
$sm = $conn->getSchemaManager();
PHP Conference Brazil 2009 www.doctrine-project.org
44. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Schema Manager
• Dispara DDLs através de uma API intuitiva:
– createTable()
– dropTable()
– createForeignKey()
• Introspecção do seu schema:
– listTables()
– listTableColumns()
– listUsers()
PHP Conference Brazil 2009 www.doctrine-project.org
45. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Remover e Criar uma Tabela
$columns = array(
'id' => array(
'type' => Type::getType('integer'),
'autoincrement' => true,
'primary' => true,
'notnull' => true
),
'name' => array(
'type' => Type::getType('string'),
'length' => 255
),
);
$sm->dropAndCreateTable('user', $columns);
PHP Conference Brazil 2009 www.doctrine-project.org
46. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Criar uma chave estrangeira
$definition = array(
'name' => 'user_id_fk',
'local' => 'user_id',
'foreign' => 'id',
'foreignTable' => 'user'
);
$sm->createForeignKey('profile', $definition);
PHP Conference Brazil 2009 www.doctrine-project.org
47. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
E muito mais...
• DBAL cheia de recursos para manipular sua
base com comandos DDL
• Inspecione sua base e aprenda sobre ela
• Execute queries e recupere dados
• Suporte a transações
PHP Conference Brazil 2009 www.doctrine-project.org
48. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O recurso chave da ORM
PHP Conference Brazil 2009 www.doctrine-project.org
49. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Doctrine Query
Language
PHP Conference Brazil 2009 www.doctrine-project.org
50. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
DQL significa Doctrine Query
Language e é fortemente
influenciada por HQL do Hibernate
PHP Conference Brazil 2009 www.doctrine-project.org
51. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Dialeto OQL (Object
Query Language)
proprietário
PHP Conference Brazil 2009 www.doctrine-project.org
52. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
A DQL é processada por
um parser LL(*) escrito
manualmente
PHP Conference Brazil 2009 www.doctrine-project.org
53. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Constrói AST
PHP Conference Brazil 2009 www.doctrine-project.org
54. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
AST = Abstract Syntax Tree
PHP Conference Brazil 2009 www.doctrine-project.org
55. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Representação na forma de
Árvore de uma estrutura sintática
de um código de uma linguagem
PHP Conference Brazil 2009 www.doctrine-project.org
56. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Nomes de classes PHP do DQL parser
representam diretamente a linguagem
OrderByClause.php
SelectClause.php
SelectExpression.php
Subselect.php
DeleteClause.php
etc. etc.
PHP Conference Brazil 2009 www.doctrine-project.org
57. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Cada recurso DQL possui uma
classe para manipular seu
processamento
PHP Conference Brazil 2009 www.doctrine-project.org
58. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
• Fácil de usar
• Fácil de expandir e incluir novos recursos
• Fácil de usar e entender o processamento
de uma consulta DQL
• Expanda o DQL parser com sua própria
funcionalidade e adicione à linguagem DQL
PHP Conference Brazil 2009 www.doctrine-project.org
59. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O DQL parser é muito rápido. Com
um cache de SQL gerada fica
praticamente invisível.
PHP Conference Brazil 2009 www.doctrine-project.org
60. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Exemplo de DQL Query
$query = $em->createQuery(
'SELECT u, g, FROM User u ' .
'LEFT JOIN u.Groups g ' .
'ORDER BY u.name ASC, g.name ASC'
);
$users = $query->execute();
PHP Conference Brazil 2009 www.doctrine-project.org
61. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Usando o QueryBuilder
$qb = $em->createQueryBuilder()
->select('u, g')
->from('User', 'u')
->leftJoin('u.Groups', 'g')
->orderBy('u.name', 'ASC')
->addOrderBy('g.name', 'ASC');
$query = $qb->getQuery();
PHP Conference Brazil 2009 www.doctrine-project.org
62. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Executando as Queries
$users = $query->execute();
foreach ($users as $user) {
// ...
foreach ($user->getGroups() as $group) {
// ...
}
}
PHP Conference Brazil 2009 www.doctrine-project.org
63. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Trabalhando com Entidades
PHP Conference Brazil 2009 www.doctrine-project.org
64. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O EntityManager
PHP Conference Brazil 2009 www.doctrine-project.org
65. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
O EntityManager é
responsável por gerenciar a
persistência das Entidades
PHP Conference Brazil 2009 www.doctrine-project.org
66. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Criando o EntityManager
$config = new DoctrineORMConfiguration();
$config->setMetadataCacheImpl(new DoctrineCommonCacheArrayCache);
$config->setProxyDir(__DIR__ . '/Proxies');
$config->setProxyNamespace('Proxies');
$connectionOptions = array(
'driver' => 'pdo_sqlite',
'path' => 'database.sqlite'
);
$em = DoctrineORMEntityManager::create($connectionOptions, $config);
PHP Conference Brazil 2009 www.doctrine-project.org
67. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Persistindo Entidades
$user = new User;
$user->setUsername('gblanco');
$user->setPassword('changeme');
$profile = new Profile;
$profile->setName('Guilherme Blanco');
$user->setProfile($user);
$em->persist($user);
$em->persist($profile);
$em->flush();
PHP Conference Brazil 2009 www.doctrine-project.org
68. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Removendo Entidades
$user1 = $em->find('User', 1);
$user2 = $em->find('User', 2);
$em->remove($user1);
$em->remove($user2);
$em->flush();
PHP Conference Brazil 2009 www.doctrine-project.org
69. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
EntityManager::flush()
• Executa quaisquer alterações das entidades
gerenciadas
• Executa de forma eficiente comandos de
insert, update e delete (Topological Sorting)
• Mantenha o número de operações flush()
baixo (1-2 vezes por requisição)
PHP Conference Brazil 2009 www.doctrine-project.org
70. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Cache de Metadados
$config = new DoctrineORMConfiguration();
$config->setMetadataCacheImpl(new DoctrineCommonCacheApcCache);
PHP Conference Brazil 2009 www.doctrine-project.org
71. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
No ambiente de produção, “cacheie”
as instâncias de ClassMetadata
populadas via processamento de
Annotations, YAML, XML, etc.
PHP Conference Brazil 2009 www.doctrine-project.org
72. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Cache de Queries
$config->setQueryCacheImpl(new DoctrineCommonCacheApcCache);
PHP Conference Brazil 2009 www.doctrine-project.org
73. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
No ambiente de produção,
“cacheie” o processamento da
consulta DQL armazenando a
SQL final gerada
PHP Conference Brazil 2009 www.doctrine-project.org
74. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Cache de Resultados
$config->setResultCacheImpl(new DoctrineCommonCacheApcCache);
PHP Conference Brazil 2009 www.doctrine-project.org
75. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Em ambiente de produção,
“cacheie” os dados populados
prevenindo consultas
desnecessárias à base de dados
PHP Conference Brazil 2009 www.doctrine-project.org
76. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Usando o Cache de Resultados
$query = $em->createQuery('SELECT u FROM ModelsUser u')
$query->useResultCache(true, 3600, 'user_query');
$users = $query->execute();
Execute novamente e os resultados serão
retornados do cache ao invés de acessar a
base novamente
$users = $query->execute();
PHP Conference Brazil 2009 www.doctrine-project.org
77. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Usando o Cache de Resultados O processamento
desta query só acontece
uma vez com o Cache de
Query
$query = $em->createQuery('SELECT u FROM ModelsUser u')
$query->useResultCache(true, 3600, 'user_query');
$users = $query->execute();
Execute novamente e os resultados serão
retornados do cache ao invés de acessar a
base novamente
$users = $query->execute();
PHP Conference Brazil 2009 www.doctrine-project.org
78. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Mapeando Herança
PHP Conference Brazil 2009 www.doctrine-project.org
79. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Mapped Superclasses
PHP Conference Brazil 2009 www.doctrine-project.org
80. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
/** @MappedSuperclass */
abstract class MappedSuperclassBase
{
/** @Column(type="integer") */
private $mapped1;
/** @Column(type="string") */
private $mapped2;
/**
* @OneToOne(targetEntity="MappedSuperclassRelated1")
* @JoinColumn(name="related1_id", referencedColumnName="id")
*/
private $mappedRelated1;
// ... more fields and methods
}
PHP Conference Brazil 2009 www.doctrine-project.org
81. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Extende a Superclass
PHP Conference Brazil 2009 www.doctrine-project.org
82. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
/** @Entity */
class EntitySubClass extends MappedSuperclassBase
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
// ... more fields and methods
}
PHP Conference Brazil 2009 www.doctrine-project.org
83. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Single Table Inheritance
PHP Conference Brazil 2009 www.doctrine-project.org
84. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discriminator", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
*/
class Person
{
// ...
}
/**
* @Entity
*/
class Employee extends Person
{
// ...
}
PHP Conference Brazil 2009 www.doctrine-project.org
85. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Single Table
• Todas as classes da hierarquia são mapeadas
para uma única tabela
• Coluna de discriminação usada para distinguir
o tipo da linha na tabela
• Eficiente para consultar entre todos os tipos
na hierarquia ou tipos específicos
• Consultas limitadas pelo tipo de discriminição
PHP Conference Brazil 2009 www.doctrine-project.org
86. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Class Table Inheritance
PHP Conference Brazil 2009 www.doctrine-project.org
87. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
*/
class Person
{
// ...
}
/** @Entity */
class Employee extends Person
{
// ...
}
PHP Conference Brazil 2009 www.doctrine-project.org
88. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Class Table
• Cada classe na hierarquia é mapeada em
diversas tabelas
• Tabela de uma classe filho é linkada com a
tabela da classe pai
• Coluna de discriminação usada para
distinguir o tipo de linha na tabela
• Consultas quase sempre requerem joins
PHP Conference Brazil 2009 www.doctrine-project.org
89. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Testes
PHP Conference Brazil 2009 www.doctrine-project.org
90. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
PHPUnit para Test Unitário
PHP Conference Brazil 2009 www.doctrine-project.org
91. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
MacBlanco:tests guilhermeblanco$ phpunit --no-static-backup Doctrine/Tests/AllTests.php
PHPUnit 3.4.1 by Sebastian Bergmann.
...............................................S.SS......... 60 / 696
............................................................ 120 / 696
............................................................ 180 / 696
....SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS................... 240 / 696
............................................................ 300 / 696
............................................................ 360 / 696
............................................................ 420 / 696
............................................................ 480 / 696
............................................................ 540 / 696
............................................................ 600 / 696
......................................SSSS.................. 660 / 696
.....SS.S......S..SS.S......S..SS.S.
Time: 5 seconds
OK, but incomplete or skipped tests!
Tests: 696, Assertions: 1847, Skipped: 55.
PHP Conference Brazil 2009 www.doctrine-project.org
92. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Sismo para
Continuous Integration
PHP Conference Brazil 2009 www.doctrine-project.org
93. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
PHP Conference Brazil 2009 www.doctrine-project.org
94. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
PHP Conference Brazil 2009 www.doctrine-project.org
95. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Growl Notifications
PHP Conference Brazil 2009 www.doctrine-project.org
96. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Sismo fica de olho em todos nossos
projetos. Nós também rodamos os testes
do Doctrine 2 em múltiplos banco de
dados suportados.
PHP Conference Brazil 2009 www.doctrine-project.org
97. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Tipos Customizados
PHP Conference Brazil 2009 www.doctrine-project.org
98. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
namespace DoctrineDBALTypes;
class MyCustomObjectType extends Type
{
public function getName()
{
return 'MyCustomObjectType';
}
public function getSqlDeclaration(array $fieldDeclaration,
DoctrineDBALPlatformsAbstractPlatform $platform)
{
return $platform->getClobDeclarationSql($fieldDeclaration);
}
public function convertToDatabaseValue($value,
DoctrineDBALPlatformsAbstractPlatform $platform)
{
return serialize($value);
}
public function convertToPHPValue($value)
{
return unserialize($value);
}
}
PHP Conference Brazil 2009 www.doctrine-project.org
99. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Type::addType(
'MyCustomObjectType',
'DoctrineDBALTypesMyCustomObjectType'
);
PHP Conference Brazil 2009 www.doctrine-project.org
100. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Sobrepondo Tipos
PHP Conference Brazil 2009 www.doctrine-project.org
101. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
class MyString extends StringType
{
}
Type::overrideType('string', 'DoctrineDBALTypesMyString');
PHP Conference Brazil 2009 www.doctrine-project.org
102. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Perguntas???
PHP Conference Brazil 2009 www.doctrine-project.org
103. Doctrine 2.0: A evolução da persistência em PHP Benjamin Eberlei, Guilherme Blanco, Jonathan Wage & Roman Borschel
Guilherme Blanco
guilhermeblanco@php.net
+55 16 9215-8480
Twitter: @guilhermeblanco
MSN: guilhermeblanco@hotmail.com
PHP Conference Brazil 2009 www.doctrine-project.org