Gerador de código fonte (PHP, Laravel) — Por que? Como funciona?

Tiago Rodrigues
4 min readFeb 27, 2018

Recentemente lancei meu primeiro protótipo de um gerador de código, o AppStart. Neste artigo vou explicar por que tenho trabalhado neste sistema, e qual o objetivo de criar um gerador de códigos desse. A história é um pouco longa então, pegue o café e vamos lá!

Interface Visual da plataforma AppStart

Tudo começou uns 4 anos atrás, quando eu estava cursando a faculdade de Análise de Sistemas. Eu já tinha uma noção de programação, e durante algumas aulas, ficava imaginando como poderia programar mais rápido e ganhar tempo. Eu começava à perceber que algumas coisas eram repetitivas e na minha cabeça, o que rolava era mais ou menos o seguinte:

“Se eu conseguir fazer mais rápido, eu com certeza vou ganhar mais dinheiro.”

Sei hoje que ganhar mais como desenvolvedor envolve muitas outras coisas, além de desenvolver mais rápido. Mas sei que se conseguir agilizar o início de uma aplicação ajuda bastante.

Bom, acabou que eu fiquei aficionado por agilizar o desenvolvimento de software. A primeira coisa que notei, em sistemas, que era muito repetitivo era o CRUD.

Foi aí que nasceu meu primeiro projeto, o Cendi. Era mais ou menos assim, eu abria um arquivo PHP, digitava algo como:

E ele, além de gerar as telas, já criava as tabelas no banco se não existisse. Na época me parecia maravilhoso, mas com o tempo fui descobrindo padrões e outras formas de desenvolver, o que me fez abandonar o projeto pois era bastante limitado.

Durante estes anos, fiz inúmeras tentativas. A maioria funcionava, gerava um CRUD, mas esbarrava em alguns problemas como:

  • Era difícil portar para novas linguagens e frameworks
  • Não tinham uma engine de templates eficiente
  • Não era genérico, o que dificultava a manutenção do código gerado
  • O código gerado não tinha condições de seguir boas práticas
  • Não era muito personalizado
  • Era muito limitado para relacionamentos

De posse desses problemas, cerca de uma ano e meio atrás eu desenvolvi a primeira versão do que hoje chamo de PWC, o gerador escrito em NodeJS que está por trás da plataforma. Ele funcionava e já resolvia parcialmente os problemas acima. Nessa primeira versão ele gerava aplicações com Slim Framework para API, e AngularJS como SPA.

O principal conceito introduzido nessa nova versão era a separação do gerador em três partes:

  • O arquivo descritivo, que nessa época era um JSON (hoje é YAML) que descrevia todo o projeto, com seus models, relacionamentos, etc.
  • O Smart Filter que processa todos estes dados, toma algumas decisões baseados nas entradas, valida e complementa os dados
  • O Generator, que é um script que recebe os dados do Smart Filter, e de acordo com isso gera o código fonte. O Generator pode ser trocado à qualquer momento, de forma similar ao gerador yeoman. Nisso surgiu a flexibilidade de, com o mesmo arquivo descritivo, criar inúmeras versões do código para uma mesmo projeto.

A segunda versão do PWC introduziu diversas melhorias nestes conceitos, e implementou um novo: a Template Engine. Foi criada uma Template Engine totalmente nova e voltada ao conceito de geração de código. O gerador recebe uma instância dessa engine e pode utilizá-la como quiser. Praticamente, é “Código para criar código”.

Os dados tratados pelo Smart Filter podem ser passados diretamente para a engine, que suporta completamente a sintaxe do JavaScript, dando um poder enorme. Além disso a engine conta com helpers especiais para ajudar à manter o código gerado dentro dos padrões.

Outra vantagem dessa estrutura é que é muito fácil tratar os relacionamentos, o que melhorou ainda mais os geradores, podendo não só gerar o CRUD padrão, como seus relacionamentos e até mesmo elementos visuais para isso, como DataGrids, Selects, etc. A imaginação é o limite :D

Segue um exemplo de um arquivo que será processado pela engine para criar um Seeder de permissões em um projeto Laravel:

Este é um caso de arquivo simples, mas existem marcações especiais para arquivos mais complexos, com muita identação e lógica, etc.

Por que Laravel?

Nesse interim, entre as inúmeras tentativas de construir o gerador, eu me deparei com o Laravel (um conhecido framework PHP). Apesar de ainda não me considerar um expert neste framework, e estou longe disso, é o framework que mais domino. Por isso, para o protótipo da plataforma, escolhi criar um gerador que gere código Laravel/PHP. Nada impede criar geradores para outros frameworks e linguagens, o PWC foi criado justamente para ter essa maleabilidade.

Neste momento, através da plataforma AppStart, estou testando e obtendo feedbacks, para melhorar tanto o PWC internamente, quando o gerador do Laravel e, futuramente criar geradores para outros frameworks.

O que vem no futuro?

A plataforma ainda está dando seus passos iniciais e, talvez, olhando para sua simplicidade, não dê para visualizar a capacidade do PWC que está rodando por trás.

Desejo adicionar diversos recursos à plataforma AppStart como:

  • Possibilidade de montar um site simples atrelado aos dados
  • Adicionar componentes personalizados, tipo: Módulo de Finanças, Módulo de Estoque, para quem desejar algo ainda mais rápido
  • Gerar Testes
  • Gerar rotas de API, já com um JSON do Postman bonitão
  • Possibilidade de “hackear” como quer gerar o sistema, exemplo: poder escolher a estrutura de pastas (pode ser um DDD, pode ser customizado), se vai gerar ou não com repositories, com autorização, etc. Na verdade já é totalmente possível, só não tive tempo de criar uma interface para isso
  • Enviar e controlar o projeto no GIT
  • E é claro, aguardar o feedback de vocês para colocar as melhores features neste projeto

Qualquer dúvida ou sugestão, estou totalmente à disposição. Um abraço e agradeço por ter lido até aqui!

Edit 19/03/2018: O PWC agora é totalmente Open Source e você pode encontrá-lo aqui: https://github.com/pwc-code-generator. Em breve farei um vídeo explicando todos os detalhes de funcionamento e como ajudar no desenvolvimento.

--

--