Posts da Tag: Doctrine - Blog da TreinaWeb

PHP

Primeiros passos com Doctrine ORM

O Doctrine ORM é um dos projetos mais importantes do conjunto de projetos Doctrine. Ele é um ORM implementado usando o padrão Data Mapper e pode ser usado desde pequenos projetos até grandes aplicações. Pode ser usado em conjunto com grandes frameworks PHP como Symfony, Laravel, Zend, Slim e outros.

Quando falamos de Doctrine a maioria das pessoas já pensa no ORM, porém o Doctrine é um conjunto de projetos para PHP. Temos um post falando sobre os principais projetos do Doctrine, aconselho a leitura antes de prosseguir com este.

Doctrine ORM - Fundamentos
Curso de Doctrine ORM - Fundamentos
CONHEÇA O CURSO

Funcionamento e Bancos suportados

O Doctrine ORM funciona sobre outro projeto, o Doctrine DBAL. O DBAL é uma camada de abstração escrita sobre o PDO, ela adiciona uma série de recursos e permite a escrita de código interoperável entre diferentes sistemas gerenciadores de banco de dados.

O Doctrine ORM tira proveito da interoperabilidade do DBAL e da parte de baixo nível do PDO. Essa estrutura permite ao Doctrine ORM suportar os principais gerenciadores de banco de dados:

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle
  • SQLite

Mapeamento do banco de dados

Quando vamos usar um ORM a primeira coisa que precisamos fazer é realizar o mapeamento entre as tabelas do modelo relacional para o modelo orientado a objetos. No Doctrine ORM temos 4 opções de notações para descrever as características do banco de dados.

Em aplicações legadas provavelmente encontrará a maioria dos mapeamentos usando XML. Em aplicações mais novas o mapeamento mais utilizado é o através de annotations (comentários que são lidos pelo doctrine).

Entidade

As entidades são usadas para realizar o mapeamento entre o modelo orientado a objetos e o modelo relacional. Por meio delas conseguimos representar exatamente a estrutura do nosso banco de dados. É possível definir nome de tabelas, colunas, chave primária e relacionamentos.

Na imagem abaixo, podemos ver a representação entre o modelo orientado a objetos a esquerda e o modelo relacional a direita:

Modelo de representação ORM

No projeto as entidades são representadas por classes PHP onde declaramos as propriedades de acordo com a tabela do banco de dados. A entidade produto do exemplo acima, poderia ser representada conforme abaixo:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $nome;

    /**
     * @ORM\Column(type="decimal")
     */
    private $preco;

    /**
     * @ORM\Column(type="text")
     */
    private $descricao;

    public function getId()
    {
        return $this->id;
    }

    public function setNome()
    {
        $this->nome = $nome;
    }

    public function getNome()
    {
        return $this->nome;
    }

    public function setPreco()
    {
        $this->preco = $preco;
    }

    public function getPreco()
    {
        return $this->preco;
    }

    public function setDescricao()
    {
        $this->descricao = $descricao;
    }

    public function getDescricao()
    {
        return $this->descricao;
    }
}

Note que os comentários na classe acima iniciam com @ORM. Esses comentário são as informações de mapeamento definidas através de annotations.

PHP - Fundamentos
Curso de PHP - Fundamentos
CONHEÇA O CURSO

Entity Manager

Se verificar novamente a entidade que mapeamos, verá que ela não estende nenhuma classe da estrutura do Doctrine, ela é apenas uma classe do PHP. Desse modo, para que possamos através dela manipular qualquer informação no banco de dados precisamos de uma classe específica do Doctrine, a Entity Manager.

A Entity Manager ou em português gerenciador de entidades, é a classe do doctrine responsável por gerenciar o estado das entidades e realizar as escritas no banco de dados. Ela implementa um padrão chamado Unit of Work ou em português unidade de trabalho, esse padrão mantém uma lista das alterações realizadas nas entidades monitoradas pelo Entity Manager em memória e organiza a parte de escrita dessas alterações no banco de dados de forma consistente, quando solicitado.

Obtendo a instância do Entity Manager

O processo de obtenção da instância da classe Entity Manager vai depender muito de onde está usando o Doctrine. Abaixo alguns links de referência para alguns frameworks:

Se estiver usando o Doctrine sem nenhum Framework terá algo parecido com isso:

require_once "vendor/autoload.php";

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

$paths = [__DIR__."/src/Entities"];
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode, null, null, false);

//aqui configuramos a conexão com banco de dados
$params = [
    'url' => "mysql://usuario:senha@servidor/nome-banco"
];

//Obter a instância da classe Entity Manager
$entityManager = EntityManager::create($params, $config);

Lembrando que para o exemplo acima funcionar é necessário instalar o pacote do Doctrine ORM usando o composer:

composer require doctrine/orm

Persistindo dados

Usamos o Entity Manager para persistir informações no banco de dados. Vamos criar um novo registro no banco de dados através da entidade que defimos chamada produto.

Primeira coisa precisamos criar uma instância e definir os dados do produto:

$produto = new Produto;

$produto->setNome('Bicicleta');
$produto->setPreco(800);
$produto->setDescricao('Engrenagem fixa, azul, rápida')

Veja que estamos usando métodos setters. Isso porque nossas propriedades da entidade são sempre privadas, com isso precisamos usar os métodos setters e getters para conseguir manipular os valores.

Agora com a instância da entidade produto já definida, podemos indicar ao Entity Manager que ela deve ser persistida no banco de dados:

$entityManager->persist($produto);

No exemplo a instância da classe Entity Manager está dentro da variável $entityManager, mas poderia ser qualquer nome, dependendo de onde está usando. O importante é entender o que o método persist está fazendo, indicando que a instância deve ser monitorada.

Por fim, precisamos pedir para o Entity Manager realizar as alterações no banco de dados, pois até agora os dados estão apenas em memória. Para isso usamos o método flush:

$entityManager->flush();

Pronto! Se tiver a tabela corretamente criada e os parâmetros de conexão estiverem certos, verá o registro no banco de dados.

Considerações Finais

O Doctrine é um ORM extremamente poderoso com dezenas de recursos. Nos próximos posts vamos aprender os diferentes modos de consultar informações no banco de dados e também como configurar relações.

Desenvolvedor PHP
Formação: Desenvolvedor PHP
Nesta formação você aprenderá todos os conceitos da linguagem PHP, uma das mais utilizadas no mercado. Desde de conceitos de base, até características mais avançadas, como orientação a objetos, práticas de mercado, integração com banco de dados. Ao final, você terá conhecimento para desenvolver aplicações PHP usando as práticas mais modernas do mercado.
CONHEÇA A FORMAÇÃO

PHP

Conheça os principais projetos do Doctrine

Ao falar em Doctrine é normal pensarmos diretamente no ORM, porém o Doctrine é um conjunto de projetos em PHP voltados para trabalhar com banco de dados e outros recursos.

Projetos do Doctrine

O objetivo do doctrine inicialmente era construir um projeto único para garantir o acesso a dados de forma eficiente assim como em outras linguagens de programação, também no PHP. Com o tempo o projeto foi sendo melhorado e nesses processos os desenvolvedores começaram a observar que poderia separar o projeto em pequenos projetos que pudessem ser reutilizados, tanto dentro do próprio Doctrine quanto em outros projetos PHP, mesmo que a aplicação não utilize o Doctrine ORM em si.

Doctrine ORM - Fundamentos
Curso de Doctrine ORM - Fundamentos
CONHEÇA O CURSO

Baseado nessa filosofia hoje o Doctrine conta com mais de 15 projetos. Os principais são:

DBAL

É uma camada de abstração de acesso a dados construída sobre o PDO. Conta com recursos importantes que permitem executar queries parametrizadas, construir consultas através do query builder, além de ferramentas para ler e alterar a estrutura do banco de dados.

ORM

O Doctrine ORM é um Object Relational Mapper que implementa o padrão Data Mapper. Seu principal objetivo é facilitar o mapeamento entre o banco de dados relacional e o modelo orientado a objetos, diminuindo a complexidade do acesso aos dados.

Commom

Agrupa recursos em comum que são compartilhados por diferentes projetos do Doctrine. O objetivo principal dele é evitar que trechos de códigos com recursos comuns tenham de ser duplicados dentro dos diversos projetos do Doctrine.

Migrations

Permite a definição da estrutura do banco de dados através de arquivos dentro da aplicação, facilitando a criação do banco de dados em novos ambientes e também o versionamento da estrutura do banco.

Annotations

No PHP é comum usarmos um padrão chamado DocBlock para documentarmos nossas aplicações. As annotations nada mais são do que informações que definimos dentro desses blocos de comentários, mas que são lidas pela aplicação, ao invés de ignoradas como os demais comentários. O projeto annotation consistem em um parser (leitor) que consegue obter essas informações de forma simples.

PHP Avançado
Curso de PHP Avançado
CONHEÇA O CURSO

Collections

Projeto consiste em uma biblioteca que adiciona funcionalidades bastante úteis para o tratamento de conjuntos de informações. Podemos pensar de forma muito simplista nas collections como sendo funcionalidades adicionais sobre os arrays nativos do PHP.

Cache

Projeto muito utilizado na comunidade PHP para realização de cache. Por padrão possui drivers que permitem utilizá-lo com diferentes meios de armazenamento, como, redis, memcache e outros.

Event Manager

É um gerenciador de eventos usado em vários projetos do próprio Doctrine e também da comunidade em geral.

MongoDB Abstraction Layer

O projeto consiste em uma camada adicional de abstração que adiciona funcionalidades a extensão PHP Mongo disponível no PECL.

Mongo ODM

O Mongo ODM (Object Document Mapper) é um projeto da mesma categoria que o ORM, com a diferença que ele faz o mapeamento entre o modelo de documentos do banco de dados NoSQL Mongo para o modelo de orientado a objetos.

Outros projetos

O Doctrine ainda conta com outros projetos fora os especificados neste post. A lista completa pode ser acessada no site do Doctrine: https://www.doctrine-project.org/projects.html

Considerações finais

O doctrine conta com projetos de alta qualidade que podem ser usados em qualquer aplicação PHP, mesmo que não utilize os projetos principais como DBAL e ORM. Assim como conhecer os principais componentes do Symfony pode te ajudar na hora da escolha das bibliotecas, os projetos do Doctrine também são extremamente importantes para seu repertório.

Desenvolvedor Symfony Full-Stack
Formação: Desenvolvedor Symfony Full-Stack
Nesta formação você aprenderá desenvolver aplicações PHP usando o framework Symfony com desenvoltura. Ao final desta formação, terá condições de trabalhar em grandes aplicações web ou APIs integradas com diversos serviços, tudo isso usando as melhores práticas do mercado.
CONHEÇA A FORMAÇÃO