Como eu migrei um projeto em PHP puro para Laravel
Tags: php, braziliandevs, portugues
Published: 2021-06-13 23:00:32

_Photo by [Somya Dinkar](https://www.pexels.com/@somyadinkar?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) from [Pexels]_

Bem, a primeira coisa é que Laravel é escrito em PHP, portanto as mudanças são mais na forma de organização ou estrutura do Laravel do que qualquer outra coisa.

Programar é algo tão belo! Certo dia vi uma pergunta no twitter *mais ou menos assim*: "você continuaria programando mesmo que isso não te rendesse grana?!". A minha resposta na hora foi: Com certeza! Conheci programação por volta de 2010--2011 no Ensino Médio, em um curso básico de HTML, no momento que percebi a grandeza disso tudo (e olha que era somente HTML), eu me apaixonei! ❤ 

Por ter uma certa curiosidade de como as coisas funcionam, sempre me dediquei a "criar" coisas que já existiam. No início mantinha uma fixação imensa por criar uma rede social do zero, inclusive quando finalizei o meu curso de HTML na escola, precisava criar uma página web demostrando os meus conhecimentos. A primeira coisa que me veio em mente foi criar uma rede social, vocês já devem imaginar que tentativa falha, não é mesmo? kk Sabia somente HTML, e bem básico, mas achei que poderia criar uma rede social. Acabei entregando três arquivos: pagina-inicial-vermelha.htm, pagina-inicial-verde.html, pagina-inicial-blue.html. Sim! Dentro de cada body eu coloquei o atributo: *bgcolor="blue"*. Nem sei se existe esse atributo mais!

Chega de falar de mim, vamos pro código!

![](https://cdn-images-1.medium.com/max/800/0*NLO0xphqDazXXEj-.gif)

### **Motivos**

> ***Nem todo sistema precisa de um framework!***

Vamos deixar isso bem claro! A minha intenção aqui, principalmente se você é um iniciante, não é dizer que todo sistema que você for desenvolver vai precisar de um framework. Porém, contudo, todavia, há momentos em que utilizar um framework vai te poupar tempo. E, meus amigos: Tempo é dinheiro!

Digamos que você e sua equipe criaram um framework próprio a uns anos atrás, ou até mesmo você chegou depois que já haviam criado tal código. E agora as coisas estão ficando tão complicadas que você passa horas tentando dar manutenção ou encaixar um feature nova nesse código antigo. Fizeram uma reunião e decidiram migrar todo o código para um framework bastante conhecido pelo mundo PHP: Laravel. E é aqui que esse post entra!

#### Vamos partir do início

A primeira coisa que você precisa fazer é baixar o [código do Laravel](https://github.com/laravel/laravel). Feito isso, copie todos os diretórios do seu projeto para esse novo. Fique atendo para diretórios e arquivos com o mesmo nome!

Se, por exemplo, vocês utilizam o composer (se não, o trabalho vai ser bem maior), copie as configurações do seu projeto para o composer.json do laravel. 

Lembre-se das estruturas dos diretórios! Controllers dentro de: *app/Http/Controllers*, das models: *app/Models*. Utilize os comandos: *php artisan make:controller HomeController* e *php artisan make:model NovoModel* para gerar as novas classes. Uma coisa que vai te ajudar bastante nesse momento é o comando: "Substituir em arquivos". No PHP Storm: é *Ctrl + Shift + R*, e vscode: *Ctrl + Shift + H* (no Ubuntu, pelo menos).

Ok, vamos para as views. Suponhamos que as suas views estejam todas organizadas e separadas em diretórios, e ainda mais, que utilizava alguma forma de template aonde o arquivo de template principal (aonde fica o html, body, navbar etc), está separado do conteúdo da página. Vai ser beeem mais fácil para fazer a migração! Crie um arquivo PHP com o seguinte conteúdo:

```php
<?php
// pegue todos os arquivos .php dentro do diretório views
$files = glob('path/views/*.php');

foreach ($files as $file) {
  // altere a extensão de .php para .blade.php
  $newFile = preg_replace('/\.php$/', '.blade.php', $file);
  rename($file, $newFile);|
  //
  $content = file_get_content($newFile);
  $content = explode("\n", $content);
  // adicione um espaçamento de quatro linhas a cada início de linha
  $content = array_map(function ($line) {
    return "    " . $line;
  }, $content);
  array_unshift($content, "@extends('layouts.app')\n", "@section('content')");
  array_push($content, "@endsection\n");
  $content = implode("\n", $content);
  // adiciona dados do layout do laravel
  file_put_contents($newFile, $content);
}
```


Com isso os arquivos das views estão configurados! Caso os seus arquivos estejam diferentes, você pode adaptar o script acima. Lembre-se de compartilhar nos comentários, com isso poderá ajudar a outras pessoas!

Migramos os controllers e views, e agora talvez seja a hora mais chatinha: migrar o banco de dados! Pra criar os arquivos talvez você possa testar este código:

```php
<?php
$dbname = 'dbname';
$user = 'username';
$password = 'password';

$dbh = new PDO('mysql:host=localhost;dbname='.$dbname, $user, $password);
$tables = $dbh->query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='{$dbname}'");

foreach($tables as $row) {
    $name = $row[0];
    $class = implode('', array_map('ucwords', explode('_', $name)));
    $class = "Create{$class}Table";
    //
    $columns = $dbh->prepare("SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{$name}' AND TABLE_SCHEMA='{$dbname}'");
    $columns->execute();
    $columns = $columns->fetchAll();
    //
    $content = "<?php\n\n";
    $content .= "use Illuminate\Database\Migrations\Migration\n";
    $content .= "use Illuminate\Database\Schema\Blueprint\n";
    $content .= "use Illuminate\Support\Facades\Schema;\n\n";
    $content .= "class {$class} extends Migration\n{\n";
    $content .= "    public function up()\n    {\n";
    $content .= "        Schema::create('{$name}', function (Blueprint \$table) {\n";
    $content .= "            \$table->id();\n";
    foreach ($columns as $column) {
        $type = $column['DATA_TYPE'];
        $type = $type==='varchar'? 'string': $type;
        $type = $type==='int'? 'integer': $type;
        $columnName = $column['COLUMN_NAME'];
        $content .= "            \$table->{$type}('{$columnName}');\n";
    }
    $content .= "            \$table->timestamp();\n";
    $content .= "        });\n";
    $content .= "    }\n\n";
    $content .= "    public function down()\n    {\n";
    $content .= "        Schema::dropIfExists('{$name}');\n";
    $content .= "    }\n";
    $content .= "}\n";
    //
    $date = date('Y_m_d_His');
    $filename = "database/migrations/{$date}_create_{$name}_table.php";
    file_put_contents($filename, $content);
}

$dbh = null;
```


Esse código vai gerar pelo menos a base de uma migration, você só precisa fazer as devidas modificações.

Por fim, talvez você também precise gerar seeds:

```php
<?php

$dbname = 'dbname';
$user = 'user';
$password = 'password';

$dbh = new PDO('mysql:host=localhost;dbname='.$dbname, $user, $password);

$tables = $dbh->query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='{$dbname}'");

foreach($tables as $row) {
    $name = $row[0];
    $class = implode('', array_map('ucwords', explode('_', $name)));
    $class = "{$class}Seeder";
    //
    $columns = $dbh->prepare("SELECT * FROM {$name}");
    $columns->execute();
    $columns = $columns->fetchAll(\PDO::FETCH_ASSOC);
    $columns = array_map(function ($column) {
        $values = [];
        foreach ($column as $key => $value) {
            $values[] = "'{$key}' => '{$value}'";
        }
        $values = implode(", ", $values);
        return "            [{$values}]";
    }, $columns);
    $columns = implode(",\n", $columns); 
    //
    $content = "<?php\n\n";
    $content .= "namespace Database\Seeders;";
    $content .= "use Illuminate\Database\Seeder;\n";
    $content .= "use Illuminate\Support\Facades\DB;\n\n";
    $content .= "class {$class} extends Seeder\n{\n";
    $content .= "    public function run()\n    {\n";
    $content .= "        DB::table('clientes_tipos')->insert([\n";
    $content .= "{$columns}\n";
    $content .= "        ]);\n";
    $content .= "    }\n";
    $content .= "}\n";
    $date = date('Y_m_d_His');
    $filename = "database/seeders/{$class}.php";
    file_put_contents($filename, $content);
}

$dbh = null;
```


* * * * *

É isso! Espero ter ajudado! Até a próxima!