DEV Community

Cover image for Como eu migrei um projeto em PHP puro para Laravel
Tadeu Barbosa
Tadeu Barbosa

Posted on

Como eu migrei um projeto em PHP puro para Laravel

Photo by Somya Dinkar 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!

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. 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
// 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);
}
Enter fullscreen mode Exit fullscreen mode

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
$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;
Enter fullscreen mode Exit fullscreen mode

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

$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;
Enter fullscreen mode Exit fullscreen mode

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

Top comments (0)