Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Desenvolvimento Agil Com Doctrine Orm

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.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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…

    Be the first to comment

    Login to see the comments

  • myatech1

    May. 24, 2012
  • gustavoheinriq

    Jun. 13, 2012
  • sernovelli1

    Jun. 30, 2012
  • khyquer

    Aug. 21, 2012
  • rafaelkloss

    Aug. 24, 2012
  • jscorrea

    May. 27, 2013
  • lucasxavie

    Sep. 12, 2013
  • rodolfoti

    Oct. 25, 2013
  • fsresende2

    Dec. 25, 2013
  • MrFelipeTorres

    Feb. 17, 2014
  • movibe

    Apr. 8, 2014
  • darioajr

    Apr. 17, 2014
  • jeansantiago10

    Apr. 30, 2014
  • joaoluizcastronaufel

    May. 28, 2014
  • thulioqueiroz

    Jul. 25, 2014
  • diovanemonteiro

    Jul. 30, 2014
  • FernandoRogerio1

    Jul. 22, 2015
  • AgenorNeto

    Nov. 4, 2015
  • RezaSadeghzadeh

    Nov. 22, 2017
  • lukinhascascavel

    Mar. 24, 2018

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.

Views

Total views

21,021

On Slideshare

0

From embeds

0

Number of embeds

985

Actions

Downloads

0

Shares

0

Comments

0

Likes

37

×