Desenvolvimento Agil Com Doctrine Orm

19.849 visualizações

Publicada em

Doctrine é uma ferramenta de ORM (mapeamento objeto-relacional) para
PHP que sobrepõe a poderosa DBAL (camada de abstração de Banco de
Dados) PDO do PHP.
Um de seus principais recursos é a possibilidade adicional de escrever
consultas à base de dados através de um dialeto-SQL OO (orientado à
objeto) chamado DQL inspirado no HQL do Hibernate. Isto provê aos
desenvolvedores uma alternativa poderosa ao SQL que mantém o máximo de
flexibilidade sem qualquer necessidade de duplicação de código.

O tema da palestra é apresentar a ferramenta como uma solução ágil
para problemas recorrentes.

Publicada em: Tecnologia
1 comentário
36 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
19.849
No SlideShare
0
A partir de incorporações
0
Número de incorporações
965
Ações
Compartilhamentos
0
Downloads
0
Comentários
1
Gostaram
36
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Desenvolvimento Agil Com Doctrine Orm

  1. 1. RAD com Doctrine ORM Guilherme Blanco
  2. 2. PHP Developers!
  3. 3. Quem é você? <ul><li>Peão de fazenda por 6 anos </li></ul><ul><li>Desenvolvedor Web desde 1998, PHP desde 2001 </li></ul><ul><li>Responsável pelo site http://windows.php.net </li></ul><ul><li>Membro do grupo ProPHP </li></ul><ul><li>Desenvolvedor do core do Doctrine </li></ul><ul><li>Commiter da framework PHP Symfony, Zend Framework, PHP-Doc, PHP-Wiki, PHP-Windows e PHP-Web, ... </li></ul><ul><li>Apaixonado por jogos da série Age of Empires </li></ul>
  4. 4. O que é ORM? <ul><li>Da Wikipedia: </li></ul><ul><ul><li>“ Mapeamento objeto-relacional (ou ORM ) é uma técnica de desenvolvimento utilizada para reduzir a impedância da programação orientada aos objetos utilizando bancos de dados relacionais . As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.” </li></ul></ul>
  5. 5. Malditos Objetos! <ul><li>Aplicações PHP dependem mais de código OO </li></ul><ul><li>Mas... Como recupero objetos do meu Banco? </li></ul><ul><li>OO não mapeia naturalmente para SGBD Relacional: identificador, estado, comportamento, encapsulação, relacionamentos, atributos, etc </li></ul><ul><li>Todo este sofrimento se resume à estas palavras simples em Inglês: “ impedance mismatch ” </li></ul>
  6. 6. It’s RAD baby! <ul><li>Do dicionário: </li></ul><ul><ul><li>“ Slang and/or abbreviation for the word ‘radical’.” </li></ul></ul><ul><ul><li>“ Calão e/ou abreviatura da palavra ‘radical’.” </li></ul></ul><ul><li>Da Wikipedia: </li></ul><ul><ul><li>“ Rapid application development (RAD) , é um modelo de processo de desenvolvimento de software iterativo e incremental que enfatiza um ciclo de desenvolvimento extremamente curto (entre 60 e 90 dias).” </li></ul></ul>
  7. 7. O que é Doctrine? <ul><li>Doctrine é uma ferramenta de ORM construída para trabalhar com PHP 5.2.3+ </li></ul><ul><li>Baseada primariamente em Java Hibernate </li></ul><ul><li>Influenciada por ActiveRecord do Ruby on Rails </li></ul><ul><li>Projeto iniciado oficialmente em 2006 </li></ul><ul><li>Versão 1.0 lançada em Setembro 2008 </li></ul>
  8. 8. As camadas envolvidas
  9. 9. Fatos da vida... <ul><li>Por que eu deveria utilizar? </li></ul><ul><ul><li>Torna problemas difíceis muito mais fáceis </li></ul></ul><ul><ul><li>Reduz tempo de desenvolvimento </li></ul></ul><ul><ul><li>Reduz custo... E eu gosto de $$$! =) </li></ul></ul><ul><li>Resolvemos o problema da fome no mundo? </li></ul><ul><ul><li>Não, e também não resolve todos os seus problemas! </li></ul></ul><ul><ul><li>Ajuda mais do que atrapalha </li></ul></ul>Por que eu falei, p****!
  10. 10. Recursos <ul><li>São tantos… </li></ul><ul><ul><li>Abstração da Base de Dados </li></ul></ul><ul><ul><li>Tarefas (Tasks) via CLI </li></ul></ul><ul><ul><li>Arquivos de Schema </li></ul></ul><ul><ul><li>Data fixtures </li></ul></ul><ul><ul><li>Caching </li></ul></ul><ul><ul><li>DQL </li></ul></ul><ul><ul><li>Listeners (Query, Record, Connection, …) </li></ul></ul><ul><ul><li>Behaviors </li></ul></ul><ul><ul><li>… </li></ul></ul>
  11. 11. Abstração da Base de Dados <ul><li>Doctrine depende de PDO e suporta qualquer driver que ela possui: </li></ul><ul><ul><li>Mysql </li></ul></ul><ul><ul><li>Sqlite </li></ul></ul><ul><ul><li>Pgsql </li></ul></ul><ul><ul><li>Oracle </li></ul></ul><ul><ul><li>Mssql </li></ul></ul><ul><ul><li>Firebird </li></ul></ul><ul><ul><li>Informix </li></ul></ul><ul><li>Implementando Connection e DataDict, você pode suportar outros drivers também </li></ul>
  12. 12. 1, 2, 3... VAMOS LÁ!
  13. 13. Tarefas via CLI <ul><li><?php </li></ul><ul><li>define('DSN', 'mysql://user:password@localhost:3306/dbname'); </li></ul><ul><li>require_once 'path/to/Doctrine.php'; </li></ul><ul><li>spl_autoload_register(array('Doctrine', 'autoload')); </li></ul><ul><li>Doctrine_Manager::connection(DSN, 'sandbox'); </li></ul><ul><li>Doctrine_Manager::getInstance()->setAttribute('model_loading', 'conservative'); </li></ul><ul><li>$cli = new Doctrine_Cli(array( </li></ul><ul><li>'data_fixtures_path' => 'path/to/data_fixtures', </li></ul><ul><li>'models_path' => 'path/to/models', </li></ul><ul><li>'migrations_path' => 'path/to/migrations', </li></ul><ul><li>'sql_path' => 'path/to/sql', </li></ul><ul><li>'yaml_schema_path' => 'path/to/yaml_schema' </li></ul><ul><li>)); </li></ul><ul><li>$cli->run($_SERVER['argv']); </li></ul>
  14. 14. Tarefas via CLI <ul><li>Tarefas básicas de CLI </li></ul><ul><ul><li>Do Schema YAML para Modelos PHP </li></ul></ul><ul><ul><ul><li>php ./doctrine.php generate-models-yaml </li></ul></ul></ul><ul><ul><li>Gerando SQL a partir dos Modelos </li></ul></ul><ul><ul><ul><li>php ./doctrine.php generate-sql </li></ul></ul></ul><ul><ul><li>Gerando Tabelas no BD a partir dos Modelos </li></ul></ul><ul><ul><ul><li>php ./doctrine.php create-tables </li></ul></ul></ul><ul><ul><li>Carregando Data Fixture nas tabelas do BD </li></ul></ul><ul><ul><ul><li>php ./doctrine.php load-data </li></ul></ul></ul><ul><ul><li>Quer algo mais? Lista todas as tarefas e ajuda... </li></ul></ul><ul><ul><ul><li>php ./doctrine.php help </li></ul></ul></ul>
  15. 15. Nosso problema: Blog
  16. 16. A ARTE DE SER VAGABUNDO...
  17. 22. Data Fixtures <ul><li>Fácil especificar entradas m2m </li></ul><ul><li>Nós fizemos primeiro, não Rails! =P </li></ul>
  18. 23. Caching <ul><li>Drivers suportados: </li></ul><ul><ul><li>APC </li></ul></ul><ul><ul><li>Array </li></ul></ul><ul><ul><li>Db </li></ul></ul><ul><ul><li>Memcache </li></ul></ul><ul><ul><li>Xcache </li></ul></ul><ul><li>Mecanismos de Caching: </li></ul><ul><ul><li>Query Cache </li></ul></ul><ul><ul><li>Result Cache </li></ul></ul>
  19. 24. Caching <ul><li>$cacheDriver = new Doctrine_Cache_Memcache(array( </li></ul><ul><li>'servers' => array( </li></ul><ul><li>array( </li></ul><ul><li>'host' => 'localhost', </li></ul><ul><li>'port' => 11211, </li></ul><ul><li>'persistent' => true, </li></ul><ul><li>), </li></ul><ul><li>), </li></ul><ul><li>'compression' => false </li></ul><ul><li>)); </li></ul><ul><li>Manager level: </li></ul><ul><li>$manager->setAttribute(Doctrine::ATTR_QUERY_CACHE, $cacheDriver); </li></ul><ul><li>Connection level: </li></ul><ul><li>$conn->setAttribute(Doctrine::ATTR_QUERY_CACHE, $cacheDriver); </li></ul><ul><li>Query level: </li></ul><ul><li>$query->useQueryCache($cacheDriver); </li></ul>
  20. 25. Doctrine Query Language Dialeto SQL Orientado a Objeto usado para recuperar dados
  21. 26. DQL <ul><li>DQL torna difíceis consultas SQL simples </li></ul><ul><li>Traz POO para suas consultas à base de dados </li></ul><ul><li>Processada e convertida para seu SGBD específico </li></ul><ul><li>Processamento da DQL é cacheado </li></ul><ul><li>Funções de DB específicas também são suportadas. Expressões podem ser convertidas também </li></ul>
  22. 27. Quero ver exemplo! FROM BlogPost p INNER JOIN p.Author a LEFT JOIN p.Tags t SELECT b.id AS b__id, b.title AS b__title, b.body AS b__body, b.author_id AS b__author_id, b.slug AS b__slug, b.created_at AS b__created_at, b.updated_at AS b__updated_at, a.id AS a__id, a.name AS a__name, t.id AS t__id, t.name AS t__name FROM blog_post b INNER JOIN author a ON b.author_id = a.id LEFT JOIN blog_post_tag b2 ON b.id = b2.blog_post_id LEFT JOIN tag t ON t.id = b2.tag_id
  23. 28. Run Forest, run! <ul><li>php ./doctrine.php dql “FROM BlogPost b INNER JOIN b.Author a LEFT JOIN b.Tags t WHERE a.name = ?” “Guilherme Blanco” </li></ul>
  24. 29. DQL <ul><li>php ./doctrine.php dql “ SELECT bp.*, COUNT(t.id) AS num_tags FROM BlogPost bp LEFT JOIN bp.Tags t GROUP BY bp.id” </li></ul>
  25. 30. Named Query <ul><li>Criar </li></ul><ul><li>Obter </li></ul><ul><li>Executar </li></ul>
  26. 31. Eu amo a vagabundagem...
  27. 32. TRABALHANDO COM OBJETOS
  28. 33. Accessor/Mutator <ul><li>3 tipos possíveis, basta escolher! </li></ul><ul><li>Fáceis de usar... </li></ul>
  29. 34. Sobrescrevendo <ul><li>Sobrescrever accessors e mutators facilmente </li></ul><ul><li>Funções reconhecidas e invocadas como accessors normais </li></ul><ul><li>Utilize _get/_set para evitar loop infinito </li></ul>
  30. 35. Sobrescrevendo
  31. 36. Que hidratante vocês usam? <ul><li>Doctrine te provê : </li></ul><ul><ul><li>Objetos </li></ul></ul><ul><ul><li>Arrays </li></ul></ul><ul><ul><li>Sem hidratação </li></ul></ul><ul><ul><li>Escalar </li></ul></ul><ul><ul><li>Escalar simples </li></ul></ul>
  32. 37. Que hidratante vocês usam?
  33. 38. Relacionamentos simples <ul><li>Relacionamentos são como deveriam ser! ;) </li></ul><ul><li>Diferentes tipos de relacionamento suportados: </li></ul><ul><ul><li>one2one </li></ul></ul><ul><ul><li>one2many </li></ul></ul><ul><ul><li>many2one </li></ul></ul><ul><ul><li>many2many </li></ul></ul><ul><ul><li>s elf </li></ul></ul><ul><li>Especifique relacionamentos de forma linear </li></ul>
  34. 39. Relacionamentos tipo orgia! m2m <ul><li>Objeto de referência é usado de forma transparente </li></ul><ul><li>Não é necessário referenciar o objeto manualmente </li></ul><ul><li>Fácil de armazenar dados extras com tabelas de apoio </li></ul>
  35. 40. Relacionamentos tipo orgia! m2m <ul><li>Fácil de se: </li></ul><ul><ul><li>relacionar (link) </li></ul></ul><ul><ul><li>largar (unlink) </li></ul></ul><ul><li>Especifica novos objetos de forma linear </li></ul><ul><li>Anexar objetos existentes </li></ul>
  36. 41. Atualizando dados <ul><li>Recuperar a atualizar </li></ul><ul><li>Atualizar com uma consulta DQL </li></ul><ul><li>Atualizações através de DQL não lançam eventos </li></ul>
  37. 42. Removendo dados <ul><li>Recuperar e remover </li></ul><ul><li>Remover sem recuperar </li></ul><ul><li>DQL delete dispara consultas individuais </li></ul>
  38. 43. Listeners & Hooks <ul><li>Transaction Listeners: </li></ul><ul><ul><li>(pre|post)Transaction(Begin|Rollback|Commit) </li></ul></ul><ul><ul><li>(pre|post)(Create|Rollback|Release)Savepoint </li></ul></ul><ul><li>Connection Listeners: </li></ul><ul><ul><li>(pre|post)(Prepare|Exec|(Stmt)?Execute|Fetch(All)?) </li></ul></ul><ul><li>Query Listeners: </li></ul><ul><ul><li>(pre|post)Hydrate </li></ul></ul><ul><ul><li>preDql(Select|Update|Delete) </li></ul></ul><ul><li>Record Listeners & Hooks: </li></ul><ul><ul><li>(pre|post)(Save|Insert|Update|Delete|Validate|Serialize) </li></ul></ul>
  39. 44. Behaviors <ul><li>Adicionam funcionalidade extra </li></ul><ul><li>Reusabilidade de código </li></ul><ul><li>Manutenção </li></ul><ul><li>Poupa tempo e $$$ </li></ul><ul><li>Possibilidade de criar seu próprio comportamento </li></ul>
  40. 45. Behaviors <ul><li>Timestampable </li></ul><ul><li>Sluggable </li></ul><ul><li>Versionable </li></ul><ul><li>I18N </li></ul><ul><li>SoftDelete </li></ul><ul><li>NestedSet </li></ul><ul><li>Geographical </li></ul><ul><li>Blameable (1.2) </li></ul><ul><li>Sortable (1.2) </li></ul>
  41. 46. QUERO VER EXEMPLO!!!!
  42. 47. O que aconteceu? <ul><li>Colunas automaticamente criadas </li></ul><ul><li>Timestampable - Automaticamente define created_at e updated_at ao salvar </li></ul><ul><li>Sluggable - Automaticamente cria um único e legível nome de identificação do objeto (slug) </li></ul>
  43. 48. Futuro – Doctrine 2.0 <ul><li>Praticamente reescrita total do código. PHP 5.3+ </li></ul><ul><li>PHPUnit como Unit Test Suite </li></ul><ul><li>Desacoplamento dos componentes </li></ul><ul><ul><li>Behaviors, Validators, YAML Schema, Data Fixtures, etc </li></ul></ul><ul><li>Separação total entre DBAL – ORM </li></ul><ul><li>DQL Compiler </li></ul><ul><li>Maior concentração em funcionalidades específicas de ORM </li></ul>
  44. 49. Doctrine 2.0 <ul><li>Code coverage bate 69%, com 262 unit tests </li></ul><ul><li>Performance: </li></ul>
  45. 50. Doctrine 2.0
  46. 51. Doctrine ORM for PHP
  47. 52. E aí, crianças… ALGUMA PERGUNTA?!
  48. 53. Doctrine Project <ul><li>Obrigado pela paciência! </li></ul><ul><li>http://www.doctrine-project.org </li></ul><ul><li>[email_address] </li></ul><ul><li>@guilhermeblanco #twitter </li></ul>Follow the Doctrine…

×