Crie seu próprio sistema de migrations em PHP! Parte 2 — Final
Tags: php, migrations, programacao, portugues
Published: 2020-07-21 10:59:40

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](https://dev-to-uploads.s3.amazonaws.com/i/ygvyjj2q2rlmsu5ng8tc.jpg)

Bem, há um motivo pelo qual me aventurei a criar tal sistema de migrations. O [Zig Money](https://github.com/valdiney/zig). Um sistema em PHP criado por um cara firmeza, o [Valdiney](https://github.com/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
<?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}";
}
```

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](https://pixabay.com/pt/users/Campaign_Creators-9720680/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=3582975)*