[UPDATE]
Este post foi escrito com base no CakePHP 2, para a versão 3 do framework este conteúdo não é aplicável. --- Este post visa mostrar a utilização de migrations no CakePHP, uma ferramenta indispensável para quando o projeto está crescendo ou mesmo para o trabalho em equipe.
Rodando o comando ./app/Console/cake schema uma tela semelhante à imagem seguinte aparecerá em seu terminal. Aqui há uma lista das opções que o schema nos possibilita fazer.
Como ainda nem temos tabelas em nosso banco de dados selecionamos a opção generate. Isto lerá a estrutura do banco de dados e criará um arquivo chamado schema.php em app/Config/Schema que estará sem nenhuma estrutura de banco de dados ainda.
Com o plugin Migrations já instalado e carregado no bootstrap se rodarmos o comando ./app/Console/cake Migrations.migration o resultado será esta tela abaixo.
Precisamos iniciar o Migrations, fazemos isto com o comando ./app/Console/cake Migrations.migration run all -p Migrations o resultado pode ser visto abaixo.
Perceba também como ficou o nosso banco de dados. Atualmente temos apenas a tabela schema_migrations com 3 registros que foram inseridos quando rodamos o comando anterior.
CREATE TABLE IF NOT EXISTS `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `password` varchar(60) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;Com isso rodamos o comando ./app/Console/cake Migrations.migration generate. Seguimos os passos descritos na seção anterior, desta vez selecionamos para ver o que será alterado em nosso banco de produção. Ao aparecer a pergunta "Do you want to preview the file before generation? (y/n)" informe y e perceba como as estruturas de up e down estão vazias. Cancele a operação com CTRL+C para que não seja gerada mais uma classe de migração vazia.
Isto ocorre porque o Migrations compara o schema.php com todos os migrations que existem na pasta app/Config/Migration e, tan dan, com os models de sua aplicação. Isto significa que não interessa quantas alterações você tenha realizado no banco de dados, somente o que estiver mapeado por algum Model será adicionado na migração.
Com o comando ./app/Console/cake bake all User criamos toda e estrutura de usuários.
Agora se rodarmos novamente o comando ./app/Console/cake Migrations.migration generate e visualizarmos as alterações antes mesmo de gravar o arquivo veremos o seguinte:
Agora que percebemos que existem alterações a serem realizadas em ambiente de homologação/produção ou mesmo para outro programador que entre no projeto basta que se definido um nome descritivo, e atualizado o schema.php como já explicado o motivo em outra seção.
Agora em seu editor veja que em app/Config/Migration existem dois arquivos, um que foi a inicialização do banco de dados sem estrutura (este arquivo terá seu up e down vazios) e um referente à criação da tabela users que terá em seu up toda e estrutura da tabela users e em seu down um hook para remoção da tabela. O hook para remoção serve para caso a migração venha a ser revertida, o banco voltar ao seu estado anterior.
Como estou fazendo tudo em máquina local, apenas copio os arquivos de uma instalção para a outra, simulando um recebimento via git pull por exemplo.Abaixo segue uma imagem mostrando o mesmo projeto estando em outra pasta, com outra configuração de banco de dados
A seguir a estrutura do banco de dados do novo desenvolvedor
Agora basta que rodemos o comando ./app/Console/cake Migrations.migration run all para que a tabela users seja criada.
Agora há apenas uma última dica que eu gostaria de passar que é referente ao novo desenvolvedor realizar alguma alteração no banco de dados. Detalhe, este procedimento nunca deve ser realizado em ambiente de homologação ou produção.
O novo desenolvedor adiciona o campo status na tabela users
E gera um novo migrations através do shell Migrations. Execute o comando ./app/Console/cake Migrations.migration generate e veja as alterações:
Perceba como em up há a coluna status com suas definições e em down a mesma é removida, novamente, o down somente é executado quando você desfaz uma migração e isto não será mostrado neste post.
Basta nomear adequadamente e sobrescrever o schema.php comojá feito antes.
Agora é o momento do desenvolvedor 1 receber a nova alteração que o desenvolvedor 2 fez e gerou migration.
Perceba a estrutura do banco do desenvolvedor 1
Rodando o comando ./app/Console/cake Migrations.migration run all após ter recebido as atualizações do desenvolvedor 2, o desenvolvedor 1 aplica toda e qualquer migração disponível.
Também é possível somente rodar o comando ./app/Console/cake Migrations.migration run que uma lista com todas as migrações disponíveis aparecerá e você pode escolher para rodar uma a uma que não estiver aplicada ainda apenas informando o ID da desejada
Este foi apenas um apanhado básico de como utilizar Migrations no CakePHP. Pode parecer bastante coisa, e é, de começo é claro pois depois que a migração está configurada tudo corre muito tranquilo.
Quer o fonte gerado neste post? Clique aqui.
Recomendo a leitura de Suites de testes no CakePHP