• Like
  • Save
Desenvolvimento Agil Com Doctrine Orm
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Desenvolvimento Agil Com Doctrine Orm

  • 17,971 views
Published

Doctrine é uma ferramenta de ORM (mapeamento objeto-relacional) para …

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.

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • Muito legal, interativo e engraçado. Não deu pra entender tudo pois estou aprendendo framework agora mas concerteza vc deixou bem explicado como funciona o ORM e o Doctrine em si.
    Obrigado
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
17,971
On SlideShare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
0
Comments
1
Likes
35

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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