PHP com Phinx: Utilizando migrations

A maioria, se não todos, os frameworks php full stack atuais têm um recurso chamado migrations (se você não sabe o que são migrações, veja este ótimo artigo de FF-OnlineTech. Usando Migrações no CakePHP 3), mas digamos que você está trabalhando em um projeto legado que não usa nenhum framework e precisa de uma forma organizada e automatizada para controlar as mudanças em seu banco de dados, nesse caso o Phinx (https://phinx.org/) pode ajudar. O phinx é uma ferramenta para escrever e executar migrações e é usado até mesmo pelo plugin de migração do framework CakePHP.

Para instalá-lo vamos usar o composer, execute o seguinte comando no composer:

Migrations php

Basicamente, consiste em manter o controle de versão do banco de dados da aplicação e manipulá-lo através de código, podendo compartilhar todo o seu histórico de alterações.

Isso facilita a vida de qualquer equipe de desenvolvimento, pois pode alterar a arquitetura da aplicação executando o código responsável por ela, que também é versionado e compartilhado com o restante do projeto.

Php inx

É um componente (palavra da própria biblioteca) que facilita muito o gerenciamento de migrações, então vamos usá-lo.

Existem várias opções de bibliotecas com a mesma finalidade, geralmente o framework já carrega um componente para esta finalidade. Por exemplo: Phinx é um projeto de Rob Morgan e está até “incorporado” no framework CakePHP por padrão.

Instalando e inicializando o Phinx
composer require robmorgan/phinx

Configurações de php

Em primeiro lugar, execute o comando abaixo:

vendor\bin\phinx init

Um arquivo .yml será criado no diretório raiz do projeto onde você deve definir o diretório onde serão geradas as migrações e as credenciais de acesso ao banco de dados.

Defina o diretório de migração na linha 2 do arquivo phinx.yml:

Tenha em mente que esses dados são dados de amostra e você deve notificar as credenciais de acesso de acordo com a configuração do seu projeto.

Phinx fornece três “ambientes” de execução, a saber: Produção, Desenvolvimento e Teste. Você pode definir qual usar na linha 7 do arquivo phinx.yml usando o sinalizador default_database.

Criando uma migration

vendor\bin\phinx create CreateTasksTable

O comando acima criará um arquivo no diretório db/migrations com a estrutura básica das migrações. Como o nome da migração sugere, escreveremos o código responsável por criar a tabela de tarefas e definir suas propriedades.

Para isso, iremos alterar o método change() com o seguinte conteúdo:

Na linha 1, definimos o nome da tabela. Na linha 2, adicionamos a coluna de descrição e, na linha 5, chamamos o método create(), responsável por fazer as alterações reais no esquema.

Executando

vendor\bin\phinx migrate

No console você deve obter o seguinte resultado:

e sucesso! Veja como as alterações são realmente feitas no banco de dados:

Caso de uso
Desenvolvimento local:

Sempre que houver alguma mudança na arquitetura do projeto, a equipe precisa buscar as migrações (controle de versão junto com o restante do código), e os desenvolvedores apenas executam o comando vendor\bin\phinx migrate e todas as mudanças são entregues ao seu base local, você não sabe? ?

Deploy:

Uma prática bastante utilizada durante a implantação de aplicativos é definir a execução das migrações em um pipeline, o que mantém o esquema de produção sempre atualizado sem precisar acessar manualmente o banco de dados.

Observações

Observe que o campo id é criado automaticamente pelo Phinx, não precisei informar isso no código de migração.

Além da possibilidade de executar consultas, inserir dados e até executar SQL se necessário, existem várias formas de manipular esquemas para criar e renomear tabelas e colunas, definir chaves estrangeiras, etc.

Eu recomendo que você visite a documentação oficial do Phinx para descobrir todos os usos possíveis e entender os tópicos avançados deste incrível componente.

Rollback php

Você pode reverter as alterações no esquema executando:

vendor\bin\phinx rollback

Conclusão

Sem dúvida, o uso de migrações facilita a manutenção de bancos de dados em projetos de software, somando-se ao poder de controle de versão e compartilhamento de código que já são onipresentes em nosso dia a dia.

Espero muito que este conteúdo seja útil para o seu estudo até a próxima!