Aprenda a construir um CRUD simples, fácil e rápido com Doctrine

Olá, tudo bem?!

No ecossistema PHP temos disponíveis diversos projetos super bacanas, e para trabalhar na camada de banco de dados temos a nossa disposição o Doctrine, o mais popular projeto voltado para Database Storage e Object Mapping.

O que você pode estar pensando é “Meu Framework X já tem implementações para isso”, sim de fato todos os grandes frameworks de mercado tem disponível componentes para abstração de banco de dados, porem uma das grandes vantagens do Doctrine é justamente ele poder ser utilizado em praticamente qualquer framework ou estrutura de projeto.

A partir do momento que você estrutura sua aplicação para utilizar o Doctrine nada o impedirá que no futuro você migre toda a lógica para outro projeto, essa facilidade vai lhe poupar muitas dores de cabeça quando chegar o momento de refatorar sua aplicação.

Sem mais delongas, vamos analisar a estrutura que será utilizada neste post, abaixo segue estrutura de diretórios e arquivo.

  • exemplo-doctrine
    • config
      • Será armazenado toda a lógica de configuração da aplicação.
    • db
      • Responsável por armazenar o banco de dados (SQLite) e o dump que será gerado.
    • src
      • Responsável por conter toda a lógica da nossa aplicação.
    • composer.json
      • Configurações do composer para o projeto.

Conforme apresentado acima, crie a estrutura de diretórios necessários para a execução deste post.

Instalando as dependências necessárias

Abra o arquivo composer.json e insira o seguinte código:

Como podemos observar, estamos utilizando os componentes do Doctrine e uma dependência  do Symfony. Após a inserção das configurações, acesse a raiz do projeto e execute o seguinte comando pelo terminal:

Aguarde o processo de instalação que pode levar alguns minutos dependendo da sua conexão de internet.

Configurando o projeto

Agora devemos criar nossas configurações necessárias para utilização do componente, acesse o diretório ‘exemplo-doctrine/config’ e crie o arquivo ‘bootstrap.php’ . Neste arquivo iremos centralizar as configurações necessárias para execução do Doctrine, segue código abaixo:

Observação: O Doctrine suporta configurações por Annontation, XML ou YAML, porem na minha opinião as annontations é a forma mais clara e fácil de definir sua entidade, gerando o menor número de arquivos possível.

Após a criação das configurações, devemos criar um arquivo que nos auxiliará nas execuções dos comandos pelo  terminal. Crie o arquivo ‘cli-config.php’ no diretório ‘exemplo-doctrine/config’ , segue código abaixo:

Criação da entidade ‘Products’

Com as devidas configurações realizadas, o próximo passo é criar a entidade que representara nossa tabela do banco de dados, para isso crie a classe ‘Products.php’ dentro do diretório ‘exemplo-doctrine/src’, segue código abaixo:

Como podemos observar, o código acima é bem simples contendo apenas atributos e métodos getters e setters, atentando ao fato de não termos criado PHPDoc, para que assim foquemos apenas nos conceitos das annontations minimizando conflito de entendimento. É por meio dessas annontations que iremos ‘informar’ ao doctrine nossa entidade e suas especificações, segue abaixo maiores detalhes sobre as annontations utilizadas:

  • Class Products

    • @Entity
      • Responsável por informar ao Doctrine que esta nossa classe é nossa entidade.
    • @Table(name=”products”)
      • Informamos que nossa entidade representa a tabela ‘products’ contida no banco de dados.
  • Column id
    • @Id
      • Informa que essa coluna é primary key.
    • @Column(type=”integer”)
      • Define o tipo “inteiro” para a coluna.
    • @GeneratedValue
      • Informa o desejo de auto increment para os valores dessa coluna.
  • Column name
    • @Column(type=”string”)
      • Define o tipo ‘string’ para a coluna.
  • Column created
    • @Column(type=”datetime”)
      • Define o tipo Datetime para a coluna.
        • Observação: Assim que implementarmos a pesquisa ficará mais claro a estrutura do objeto gerado pelo Doctrine 🙂

Após nossa entidade devidamente criada, podemos dar início a implementação dos nosso recursos.

Criando nosso banco de dados

Após a criação da entidade devemos realizar a criação do banco de dados, acesse a raiz do projeto e execute o seguinte comando:

  • vendor\bin\doctrine
    • Esta parcela do comando referencia a utilização do Doctrine que instalamos com o Composer.
  • orm:schema-tool:create
    • Comando para criação do banco de dados, lembrando que o arquivo será armazenado em ‘exemplo-doctrine/db/db.sqlite’.

Após execução do comando o retorno deve ser semelhante ao apresentado abaixo:

Como o próprio retorno nos informa, nunca devemos utilizar esta ação em produção, apenas em ambiente de desenvolvimento!

Inserindo registros no banco de dados

Para a implementação do recurso de insert,  crie a classe ‘CreateProduct.php’ dentro do diretório ‘exemplo-doctrine/src’, segue código abaixo:

Para realizarmos a inserção de dados, execute o seguinte comando pelo terminal na raiz do projeto:

Resultado:

Como podemos observar, com poucas linhas de código criamos um recurso simples para inserção de registro no banco de dados 🙂

Pesquisando todos os registros cadastrados

Para a implementação do recurso de select,  crie a classe ‘ListProduct.php’ dentro do diretório ‘exemplo-doctrine/src’, segue código abaixo:

Exemplo de retorno de pesquisa:

Como podemos observar, com apenas a chamada do método findAll() obtemos todos os registros inseridos em nossa tabela no banco de dados, o atributo ‘created’ é um objeto do tipo DateTime conforme configurado na entidade.

Pesquisando um produto em específico

Para a implementação do recurso que irá pesquisar um produto em especifico crie a classe ‘ShowProduct.php’ dentro do diretório ‘exemplo-doctrine/src’, segue código abaixo:

Como podemos observar, com o método find() podemos informar nossa entidade e o id do registro ao qual desejamos encontra na tabela.

Atualizar produtos

Para a implementação do recurso de update crie a classe ‘UpdateProduct.php’ dentro do diretório ‘exemplo-doctrine/src’, segue código abaixo:

Como podemos observar, o processo de update ocorre sem mistérios de forma clara e fácil apenas manipulando o objeto e passando para que o Doctrine faça todo o trabalho.

Remover produtos

Para a implementação do recurso de delete crie a classe ‘DeleteProduct.php’ dentro do diretório ‘exemplo-doctrine/src’, segue código abaixo:

Como podemos observar, o processo de remoção é similar a todos os demais processo, o Doctrine tem métodos descritivos que facilitam sua utilização 🙂

Remover o banco de dados (Drop database)

No dia a dia temos a necessidade de apagar nosso banco de dados, para isso o Doctrine disponibiliza um recurso para nos auxiliar. Na raiz do nosso projeto execute o seguinte comando:

Execute este comando com parcimônia, após sua execução seu banco de dados será APAGADO!

Após execução do comando será exibido uma mensagem de retorno semelhante a descrita abaixo:

Gerar dump da nossa base de dados

Um dos inúmeros recursos bacanas que o Doctrine dispõem é a criação de um arquivo dump da base de dados,  arquivo que conterá toda estrutura da tabela products, para geramos nosso arquivo execute o seguinte comando na raiz do projeto:

Após execução com sucesso do comando, será criado nosso arquivo no diretório ‘exemplo-doctrine/db/dump.sql’, contendo a seguinte estrutura:

Observação: O retorno se dá um uma única linha, porém para que fique melhor sua visualização no post foi quebrado em linhas.

No decorrer deste post podemos observar o quão fácil é a utilização do Doctrine, infelizmente apenas abordamos uma pequena fração de todo o potencial e recursos que ele nos fornece. Caso tenha interesse em seguir com seus estudos indico que adquira o livro escrito pelo Elton MinnetoDoctrine na prática” antes que alguém pense o contrário não estou ganhando nenhum centavo para indicar o livro, estou fazendo pois é o melhor livro de Doctrine em PT-BR escrito por um profissional que respeito e admiro.

Espero que tenham apreciado o post, ficou um pouco maior do que eu desejava, porem para abordar todo o ciclo de utilização tentei ser o mais descritivo possível para auxiliar a máximo a compreensão das etapas, como dito anteriormente este post é introdutório onde existem uma infinidade de recursos não explorados que valem muito a pena serem estudados.

Duvidas, sugestões, crítica ou elogios recomendo que deixe nos comentários para que assim possamos interagir e gerar mais conhecimento.

Até a próxima, abraços 🙂

6 thoughts on “Aprenda a construir um CRUD simples, fácil e rápido com Doctrine”

    1. Olá Fabio Reche.

      Agradeço por prestigiar o conteúdo e que lhe seja útil, continue acompanhando e compartilhando com seus amigos.

      Grande abraço 🙂

    1. Olá Ruan Valente, ficou feliz que tenha apreciado o conteúdo, continuem acompanhando.

      Grande abraço 🙂

  1. Ótimo tutorial. Muito obrigado.

    No meu ambiente local funcionou quase tudo certinho, mas precisei fazer uma pequena alteração e resolvi comentar aqui.

    No arquivo “ShowProduct.php” linha 23, precisei substituir

    echo sprintf('-%s\n', $product->getName() . ' - ' . $product->getCreated());

    por

    echo sprintf('-%s\n', $product->getName() . ' - ' . $product->getCreated()->format('Y-m-d'));

    Abraço

    1. Olá, James Miranda.

      Fico feliz que tenha apreciado o conteúdo.

      Realmente dependendo da configuração do PHP, exige a conversão da data, conforme descrito por você acima. Por isso que é uma boa ideia trabalhar com o objeto “DateTime”, pois com isso herdamos suas funcionalidades para o atributo.

      Obrigado por compartilhar seu conhecimento com a comunidade.

      Grande abraço 🙂

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *