DEV Community

Cover image for Crie seu próprio sistema de migrations em PHP! Parte 2 — Final
Tadeu Barbosa
Tadeu Barbosa

Posted on • Edited on

Crie seu próprio sistema de migrations em PHP! Parte 2 — Final

Bem, no último post vimos a respeito das migrations e como fazemos para criar no Laravel. E, como eu disse, existem bibliotecas disponíveis para o uso das migrations e você pode utilizar em seus projetos. Mas se tem uma coisa que gosto é saber como as coisas funcionam, como eu faço a mesma coisa ou parecida, que aquele framework fez e não simplesmente adicionar trocentas linhas de código via composer e encher o meu diretório vendor.

Ok, vamos combinar que nem sempre a gente vai criar as coisas ao invés de usar bibliotecas. E eu as utilizo! Há projetos que desenvolvo e crio em Laravel, Vuejs etc. A questão aqui não é “reinventar a roda”, mas entender como as coisas funcionam! Combinado?! ;)

Mundo open source

Alt Text

Bem, há um motivo pelo qual me aventurei a criar tal sistema de migrations. O Zig Money. Um sistema em PHP criado por um cara firmeza, o Valdiney, que está sempre envolvido com o mundo open source. Como lemos no próprio repositório:

O ZigMoney é um projeto que visa ajudar pequenos
comércios e comerciantes que precisam registrar suas
vendas diárias de forma simples e organizada.
Trata-se de um sistema web escrito em PHP e Mysql.
O intuito é disponibilizar uma plataforma
com módulos que facilite e potencialize o controle
de informações de vendas totalmente online.

A proposta, além da descrita acima, é desenvolver um sistema sem utilizar muitas bibliotecas, assim crescemos junto com o projeto. Confira e envie uma contribuição, por mais que represente pouco para você, representará muito para nós e para quem usufrui da ferramenta! :D


A ideia foi criarmos as migrations via linha de comando, adaptando um sistema de linha de comando que já existia na ferramenta. O primeiro passo foi criar a parte da linha de comando, para que ao digitar o seguinte comando: php comando.php create migration lorem ipsum dolor, fosse gerado um arquivo.sql dentro de um diretório específico. Para isso você pode criar um arquivo comando.php na raiz do projeto com o seguinte conteúdo:

<?php
$parametros    = array_slice($argv, 1);
$comando       = "{$parametros[0]} {$parametros[1]}";
$migrationNome = array_slice($argv, 3);
$migrationNome = str_replace(" ", "_", $migrationNome);
$pathname      = "migrations/{$migrationNome}.sql";

if ($comando == "create migration") {
  file_put_contents("", $pathname);
  echo "Migration criada em: {$pathname}";
}
Enter fullscreen mode Exit fullscreen mode

Claro, tentei simplificar aqui, mas você pode melhorar bastante esse sistema!

Após criar o arquivo, basta colocarmos dentro do arquivo sql gerado, o conteúdo que gostaríamos, suponhamos que digitei: `php comando.php create migration cria tabela de usuarios, o arquivo de cima irá gerar o arquivo migrations/cria_tabela_de_usuarios.sql. Dentro desse arquivo iremos colocar:


CREATE TABLE usuarios IF NOT EXISTS (
id int NOT NULL AUTO_INCREMENT,
nome varchar(60) NOT NULL,
email varchar(60) NOT NULL,
password varchar(60) NOT NULL,
PRIMARY KEY (id)
);

Lembra do nosso comando.php? Vamos alterar algumas coisas:

`php
<?php
$parametros = array_slice($argv, 1);

if (count($parametros) > 2) {
$comando = "{$parametros[0]} {$parametros[1]}";
$migrationNome = array_slice($argv, 3);
$migrationNome = str_replace(" ", "_", $migrationNome);
$pathname = "migrations/{$migrationNome}.sql";
//
if ($comando == "create migration") {
file_put_contents("", $pathname);
echo "Migration criada em: {$pathname}";
}
exit;
}

if ($parametros[0] == "migrate") {
$files = glob("migrations/*.sql", GLOB_BRACE);
foreach ($files as $file) {
$content = file_get_contents($file);
// executa o comando sql da migration
DB::execute($content);
}
}
`

Pronto! Com algumas adaptações o seu comando.php estará pronto para criar e executar as suas migrations ;)


Espero que tenham gostado e que de alguma maneira isso possa adicionar algo a sua carreira. Não deixem de conferir o ZigMoney e deixarem uma contribuição. Até a próxima!

Imagem: Tammy Duggan-Herd por Pixabay

Top comments (0)