Alura > Cursos de Programação > Cursos de PHP > Conteúdos de PHP > Primeiras aulas do curso Doctrine: conhecendo um ORM PHP

Doctrine: conhecendo um ORM PHP

ORM (Object Relational Mapping) - Apresentação

Olá pessoal, sejam muito bem-vindos à Alura. Eu sou o Vinicius Dias e vou guiar vocês nesse treinamento em que conheceremos o Doctrine. Vamos entender o que é o Doctrine e o que é um ORM Essa sigla que pode assustar algumas pessoas ou fazer os olhos de outras brilharem, porque você, com certeza, vai ler por aí que quando utilizamos um ORM não precisamos mais saber SQL.

Já quero te adiantar que se for essa a sua intenção com esse treinamento eu vou te decepcionar um pouco, porque precisamos sim saber SQL para trabalhar com qualquer ferramenta que vai utilizar bancos de dados relacional, sendo isso que um ORM faz. Embora não precisemos escrever SQL na maior parte dos casos, é muito interessante conhecermos SQL para saber o que está acontecendo por trás.

Por isso, um dos pré-requisitos desse treinamento é o curso de PDO, em que fazemos bastante consultas SQL utilizando PHP. Outros pré-requisitos, coisas que você precisa conhecer é conhecer bem o mundo orientado a objetos. Saber programar utilizando a orientação a objetos, você precisa estar familiarizado com o Composer, porque esses conceitos vão ser utilizados neste treinamento.

O que vamos aprender? Primeiro, vamos bater um papo bem rápido sobre o que é o ORM, o que significa essa sigla e como ele pode nos ajudar. Já te adianto que o ORM pode nos ajudar a não precisar, em muitos casos, de escrever SQL, mas ainda assim é muito importante conhecermos.

Outro pré-requisito que eu não citei é conhecer SQL, saber sobre algum banco de dados. Nesse treinamento vamos ver qual é o padrão que o Doctrine utiliza para se comunicar com o banco de dados e, a partir disso, vamos criar nossas primeiras configurações. Criadas as configurações, após nos conectarmos com o banco de dados, vamos ver algumas diferenças entre a versão atual do Doctrine que é a versão 2 e uma versão futura que ainda não foi lançada, até o momento da gravação desse treinamento, o Doctrine 3. Só que todo o nosso código já funciona com o Doctrine 3, não vamos ter problemas.

Conforme vamos avançando mapearemos as entidades que você vai entender o que isso significa, nós vamos criar relacionamentos entre entidades diferentes e fazer com o CRUD completo entre esses relacionamentos. No final, se você analisar o código do arquivo listen-students.php, você imagina que tem um monte de SQL acontecendo por trás? O que estamos fazendo neste código é buscando todos os alunos de algum repositório de alunos e percorrendo para cada um dos alunos exibir o seu ID e o seu nome, pegar todos os seus telefones e se existir algum, exibe esse telefone, se existirem cursos em que esse aluno está matriculado, exibe os seus cursos também.

Repare que não tem nenhum SQL, mas temos acesso ao banco de dados, nós vamos chegar a esse resultado nesse treinamento. Eu já te adianto uma coisa, nós não vamos aprender tudo o que há para aprender sobre Doctrine. Existem, inclusive, outros treinamentos de Doctrine na plataforma da Alura que recomendo que você faça depois desse curso.

Enfim, eu já falei bastante, se durante esse treinamento você ficar com alguma dúvida não hesite, abra um tópico lá no fórum. Eu tento responder pessoalmente sempre que possível, mas quando não consigo temos uma boa comunidade de alunos, moderadores e instrutores e alguém com certeza vai conseguir te ajudar. Depois de toda essa falação eu te espero no próximo vídeo para entendermos o que significa essa sigla de ORM e começarmos a configurar o nosso Doctrine para chegar a esse resultado que mostrei do código, utilizando bastante banco de dados e pouco SQL.

ORM (Object Relational Mapping) - O que é ORM?

Vamos aprender sobre o Doctrine nesse treinamento. O Doctrine é um ORM, antes de escrevermos algum código utilizando o Doctrine ou pelo menos instalá-lo, vamos entender o que é um ORM. O que significa essa sigla para começar? ORM significa Object Relational Mapping, traduzindo de forma livre é Mapeamento Objeto Relacional.

O que isso quer dizer? Um ORM é uma ferramenta que vai pegar o nosso mundo que estamos habituados a escrever códigos, com o nosso mundo orientado a objetos e vai traduzir isso, vai transformar isso para o mundo relacional, para o mundo de algum banco de dados relacional.

O que é um bando de dados relacional? É um banco de dados a que já estamos habituados como MySQL, PostgreSQL, SQLite, etc. Tem vários treinamentos na Alura sobre bancos relacionais diferentes, vale a pena você conferir isso antes. Se você não conhece nenhum banco relacional, inclusive, recomendo que você pause esse treinamento e faça um treinamento de algum banco de dados relacional.

Qual é o banco não importa, mas é importante que você conheça esse mundo relacional. Também é muito importante que você conheça o mundo orientado a objetos, porque se vamos fazer um mapeamento de um ponto para outro é interessante conhecermos os dois.

Voltando ao ponto de um ORM. O propósito dele, como eu já disse, é mapear o nosso mundo orientado a objetos para um mundo relacional. Como ele faz isso? Existem diversas abordagens para o ORM trabalhar, o Doctrine utiliza um padrão chamado Data Mapper ou Mapeamento de Dados.

Simplificando esse conceito que pode ser bem mais complexo, ele vai ter um objeto nosso, então tem a definição de uma classe que gera objetos, e vamos passar a informação para o Doctrine de mapeamento. A partir dessas informações sobre esse objeto, ele vai saber como armazenar esse objeto em uma tabela do banco de dados, em quais colunas, quais os tipos dessas colunas, etc.

O Doctrine funciona dessa forma, nós vamos ter a nossa classe PHP normal como já temos normalmente e essa classe vai ter algumas informações a mais, algumas informações extras de mapeamento. Vamos mapear essa nossa classe para alguma tabela do banco de dados, por exemplo.

Existem outras abordagens de outros ORMs. Por exemplo, o Laravel é um framework muito conhecido do mundo PHP. O Laravel tem um ORM próprio chamado Eloquent que, por sua vez, utiliza outra abordagem chamada Active Record. A tradução para Active record não faz muito sentido, pelo menos se tentarmos traduzir de forma livre para o português. Mas basicamente o padrão Active Record, pega algum objeto nosso e com as informações que estão lá esse próprio objeto vai saber se persistir, esse objeto vai saber como se encontrar no banco de dados, etc.

[´03:04] É uma abordagem diferente, com o Doctrine utilizando o Data Mapper esse nosso objeto vai ter informações de mapeamento e outra classe, algum outro objeto vai pegar esse objeto e mandar para o banco de dados. Com o Active Record, o próprio objeto vai saber como ir ao banco de dados, como salvar suas informações, etc.

São abordagens diferentes e a abordagem que vamos ver neste curso é o de Data Mapper. Quando utilizamos um e quando utilizamos outro? Eles são praticamente intercambiáveis, mas cada um tem as suas vantagens, um Active Record como o Eloquent, traz um pouco mais de simplicidade, porque com o mesmo objeto você tem as informações ali e os métodos para você salvar no banco de dados, por exemplo.

Só que, com isso, temos muita responsabilidade no mesmo objeto, isso dificulta a separação de responsabilidades e é para isso que o Data Mapper existe, é esse problema que ele resolve. Você tem o seu objeto escrito em PHP, com regras de negócio, suas validações em PHP e outro objeto vai pegar isso e mandar para o banco de dados. Esse objeto PHP nem precisa saber que existe uma tabela, que ele está sendo armazenado, etc. Por isso essa separação é possível utilizando o Data Mapper.

Eu comentei que o Laravel utiliza o Eloquent, mas é perfeitamente possível utilizar o Doctrine em qualquer framework PHP. Existe um projeto chamado Laravel Doctrine para você utilizar o Doctrine no Laravel, existe um projeto também de Laminas Doctrine para você utilizar o Doctrine no framework Laminas que, inclusive, é quase um padrão também, e o Symfony, que é outro framework PHP, já utiliza o Doctrine, por padrão.

O Doctrine é um ORM muito flexível e pode ser utilizado em qualquer cenário, em qualquer framework PHP. Nesse treinamento não vamos utilizar nenhum framework, nem vamos rodar código na Web, vamos fazer tudo pela linha de comando.

Recapitulando: um ORM é algum componente, alguma ferramenta que pega os nossos objetos e faz um mapeamento para as nossas tabelas do banco de dados. É exatamente isso que vamos fazer neste treinamento, só que antes de escrevermos código e começarmos a fazer todo esse mapeamento, precisamos instalar o Doctrine para podermos utilizar o código dele. No próximo vídeo vamos instalar o Doctrine.

ORM (Object Relational Mapping) - Instalando Doctrine ORM

Bem-vindos de volta. Estou no site oficial do Doctrine que é: doctrine-project.org e já começamos a ver que o Doctrine tem mais do que só um ORM. Inclusive, as principais bibliotecas são: ORM e uma abstração, uma camada de abstração para banco de dados. Acontece que o ORM, por trás, utiliza essa camada de abstração, ela basicamente permite que o Doctrine não precise saber qual banco de dados está sendo utilizado especificamente, etc.

Essa camada de abstração faz com que o acesso a MySQL, a Oracle e a Postgre sejam todos iguais. Simplificando, é isso que esse componente faz. E o ORM, o foco desse treinamento, utiliza essa abstração.

Existem outros componentes do Doctrine e todos eles são utilizados pelo componente de ORM, por exemplo, tenho o componente de Coleções que vamos ver nesse treinamento também. Enfim, você pode dar uma olhada em todos os projetos do Doctrine, mas vamos focar no ORM.

Podemos ir em “Object Relational Mapper(ORM)” ou em “Get Started”, qualquer um dois vai nos levar para algum lugar que vai ser interessante. Só que esse de ORM já nos mostra uma forma bem simples de instalar o ORM, já esse Get Started é um pouco mais completo e no setup do projeto ele sugere algumas outras coisas, por isso vamos utilizar esse setup.

Eu vou abrir o meu PHPStorm e vou criar esse arquivo “composer.json”. Eu tenho esse arquivo, não vou adicionar por enquanto e eu vou copiar esse conteúdo do site em “Project Setup” e vou colar no arquivo composer.json. Vamos modificar algumas coisas, primeiro, já trabalhamos com psr-4, por isso não tem motivo para ficarmos presos na psr-0. Eu vou mapear um name space que vou chamar de "Alura\\Doctrine\\", esse name space vai ser mapeado para a nossa pasta SRC, que ainda não foi criada, mas vamos criar.

Eu estou instalando nesse arquivo, o nosso ORM que vamos precisar, aquela camada de abstração, isso vai ser necessário para nós, o ORM faz uso disso. Tem o componente “doctrine/annotations”, que vamos entender melhor logo menos, esse outro componente “symfony/yaml”, para ler algumas configurações, provavelmente nem vamos precisar dele, mas não temos motivo nenhum para tirar esse daqui por enquanto, vamos deixar. E esse componente de cache que será bastante utilizado quando falarmos de performance.

Vamos deixar exatamente assim como veio da documentação todos esses componentes. Eu só mudei a parte de autoload. O que eu preciso fazer agora é rodar um composer install, vou copiar o comando, vou abrir o terminal, vou limpar e precisamos ter o Composer instalado e quando eu rodar esse comando ele vai baixar todos esses pacotes que temos no código que colamos e instalar para nós. Isso pode demorar um tempo dependendo da sua conexão, mas foi até rápido.

Repare que uma pasta vendor já foi criada com todos os componentes lá. Com isso já temos o Doctrine instalado, ele sugere algumas coisas, ele pede para adicionarmos, por exemplo, alguns arquivos de configuração, etc., mas por enquanto não vamos precisar disso.

Vamos recapitular o que temos até agora. O Doctrine é um ORM, temos o componente de ORM. Ele utiliza outros componentes, ele sugeriu alguns e eu já adicionei todos eles no código, talvez nem utilizemos todos, mas sem problema nenhum. Esse ORM, como eu comentei, utiliza um conceito de Data Mapper, de mapeamento de dados, temos os nossos objetos, as nossas classes que possuem os nossos dados e comportamentos, e vamos mapear isso daqui para alguma coisa, alguma tabela, por exemplo, no nosso banco de dados.

E eu comentei que algum objeto diferente vai pegar esse nosso objeto PHP e mandar lá para o banco de dados. O nome desse objeto que vai fazer boa parte da tarefa para nós é Entity Manager ou gerenciador de entidades. Por que o nome é esse? Esses objetos que vamos criar que possuem os nossos dados se chamam entidades, falamos sobre isso no treinamento de PDO.

Nós vamos ter entidades no nosso mundo PHP que são as nossas classes, com os dados de cada entidade mesmo. Por exemplo, pessoa é uma entidade, aluno é uma entidade. Vamos ter essa classe com todos os dados e o nosso gerenciador de entidades vai pegar essa entidade e mandar para o banco de dados.

O que precisamos fazer agora é criar um Entity Manager, um gerenciador de entidades. E é isso que vamos fazer no próximo vídeo.

Sobre o curso Doctrine: conhecendo um ORM PHP

O curso Doctrine: conhecendo um ORM PHP possui 136 minutos de vídeos, em um total de 46 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Plus

De
R$ 1.800
12X
R$109
à vista R$1.308
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

Matricule-se

Pro

De
R$ 2.400
12X
R$149
à vista R$1.788
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Luri powered by ChatGPT

    Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com Luri até 100 mensagens por semana.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas