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

4 2

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

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more →

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more