Ambiente de Desenvolvimento PHP com Docker - Parte Final - Laravel/Lumen & TDD & PHP Unit

Danilo Lutz
7 min readJan 16, 2019

--

Fala galera, como vão?

É eu sei, eu sei, estou atrasado né, beeemmm atrasado ¬¬’ … desculpem, coisas da vida… o importante é que estamos todos aqui para finalizar o nosso ambiente de desenvolvimento… mas Danilo, já não acabamos?

Tsc, tsc sim em partes, não em partes, explico: como vimos nas partes anteriores já é possível saber como Dockerizar uma aplicação PHP.

Porém para encerrar com chave de ouro vamos, inclusive pôr no nosso ambiente um framework, e por que não o Laravel ou o Lumen? Lumen no caso.

Vamos também tirar proveito das convenções do framework, para fazermos mais escrevendo o mínimo possível.

E também vamos aprender a rodar os testes do framework com o PHP Unit, para quem curte um TDD (ou Tests-Driven Development).

Do que precisaremos:

Estou muito detalhista hoje hehehe.

Vamos pôr a mão na massa?

Esse passo consiste em revisar o nosso ambiente Docker com algumas coisas… Deixem o arquivo app/.docker/Dockerfile da seguinte maneira:

Agora vamos deixar o arquivo app/.docker/vhosts da seguinte forma:

Vamos também modificar para que o arquivo Makefile fique do seguinte modo:

Isso mesmo com cometários e tudo mais rsrsrs.

Agora vamos entrar no container do nosso PHP, usarei o vscode para facilitar:

Cliquem no ícone da baleia para abrir as opções do Docker.
Docker explorer aberto.
Expandam a opção Container que é exibida na tela do Docker Explorer.

Ao expandir a opção Container verão todos os Containers presentes do Docker. Procurem pelo Container com o nome: ambientephp_app e cliquem na opção “Attach Shell”. E o vscode abrirá a seguinte tela

Tela com o Terminal aberto já com o Bash do Container pronto para receber comandos.

O nosso container já está configurado para abrir o Bash na pasta da aplicação. Então vamos agora instalar o Lumen e ver como funciona o tal TDD…

Digitem aí os seguintes comandos:

composer create-project --prefer-dist laravel/lumen temp_install
mv temp_install/* temp_install/.* .
rm -Rf temp_install

Nota: Composer, para quem não sabe, é o gerenciador de pacotes do PHP.

Nota 2: O comando mv gerará alguns erros por conta do coringa *, apenas ignorem.

Feito isso tudo, após a instalação de todos os pacotes do Composer, podemos descomentar as linhas comentadas no arquivoMakefile, com exceção a linha 7.

Agora podemos desligar os Containers que estão rodando e fazer um último teste no Makefile. No Terminal fora do vscode, na pasta raiz do projeto, procedam da seguinte forma:

docker-compose stop
make setup

Digitem no navegador o endereço: localhost… E voilà! Vocês verão o Lumen rodando já!

Tela exibindo o Lumen em funcionamento.

Mas Danilo: Qual a utilidade do Make e talz? Facilitar a vida do teu próximo, vocês criaram um projeto do zero, os próximos a colaborarem com vocês neste projeto poderão simplesmente baixar e digitar o(s) comando(s) referente(s) ao Make e tudo será construído automaticamente, legal né?

Mas atenção: idealmente o Make é um facilitador para rodar o projeto e criar toda a estrutura apenas na primeira vez que o projeto é clonado do repositório.

Tudo certinho? Então vamos prosseguir…

Rodando os Testes

Abram o Bash do Container, como já feito anteriormente e digitem:

php vendor/bin/phpunit

E verão que o Lumen já possui um teste de exemplo out-of-the-box como mostra a imagem abaixo.

Test unitário out-of-the-box do Laravel/Lumen

Agora vamos fazer com que nosso Laravel/Lumen esteja configurado para acessar o banco de dados do nosso ambiente Docker.

Abram o arquivo .env que pode ser encontrado na raiz do projeto. E o deixem da seguinte maneira de acordo com o que fizeram na parte 1.

As alterações ocorreram da linha 11 até 16, de acordo com a configuração que vocês colocaram no docker-composer.yml

Vamos criar um teste nosso na pasta tests encontrada na raiz do projeto, dessa maneira:

Ao rodarmos o comando do PHPUnit novamente ele falhará, e está certo, afinal é isso que diz o TDD: Primeiro criamos um teste e depois escrevemos o código para fazê-lo passar, rodando os testes unitários a cada passo.

Vamos criar agora um Migration, um Model, uma factory, um Seeder, um Controller e uma Route. Todos esses já são recursos do Laravel/Lumen.

No caso do Migration usaremos o terminal para criá-lo, vamos criar uma tabela chamada categories:

php artisan make:migration create_categories_table --create=categories

Nota: Migrations são um modo de versionar o banco de dados através de scripts do PHP. No caso do Laravel/Lumen, existem algumas convenções que podemos seguir para deixarmos as coisas o mais automatizadas possível, veja aqui.

O método increments criará uma primary key auto incrementável no banco de dados.

O método timestamps criará as colunas created_at e updated_at automaticamente na tabela.

No caso do Model vamos criar o arquivo Category.php manualmente dentro de /app/. Onde já encontraremos um Model chamado User.php.

Simples certo? Existem algumas configurações extras que podem ser feitas como formatação de datas, exclusão lógica e etc.

Porém para o nosso propósito usaremos apenas isso. Caso queiram se aprofundar basta acessarem a documentação do Eloquent.

Agora vamos a Factory, que nada mais é que um recurso para povoar nosso banco de dados automaticamente, sem que precisemos perder tempo com imensos arquivos de script SQL.

Vá em database/factories e abra o arquivo ModelFactory.php que já está lá. E deixem ele da seguinte forma:

O método sentence do Fake Generator irá criar para nós uma frase aleatória com quatro palavras.

Agora vamos em database/seeds configurar o Seeder, abram o arquivo DatabaseSeeder.php contido na pasta e deixem como abaixo.

Nota: O Seeder vai automatizar o processo de criação de registros no banco de dados, usando o factory que configuramos anteriormente.

Agora para executarmos tudo que fizemos precisamos ir no Bash do Container novamente e executar o seguinte comando:

php artisan migrate --seed

E vocês obterão o seguinte resultado:

E se acessarem o banco de dados encontrarão o seguinte resultado:

Agora vamos na pasta app/Http/Controllers criar nosso Controller crie um arquivo como mostrado abaixo, com o seguinte nome: CategoryController.php.

Agora vamos modificar o último arquivo necessário: routes/web.php e deixemos ele assim:

Uma última alteração a ser feita é ativar as Facades e o Eloquent no caso do Lumen, no Laravel isso já vem ativado, vão no arquivo: bootstrap/app.php e descomentem as seguintes linhas:

$app->withFacades();$app->withEloquent();

Agora podemos rodar o comando do PHPUnit novamente, no container:

php vendor/bin/phpunit

Bom, os testes passaram e já temos uma API que é capaz de fazer um CRUD de Categorias, agora é hora de enviar tudo para o Github, como já vimos anteriormente.

Vamos adicionar o arquivo .gitignore para Git ignorar os arquivos que não devem ir para o repositório, vão na pasta raiz do projeto e adicionem o seguinte arquivo:

Nosso script de pre-commit vai se encarregar da qualidade do código e só nos permitirá fazer o commit de algo para o repositório caso tudo esteja ok.

Como podemos conferir não está tudo ok e o PhpCf encontrou alguns problemas que, de fato, existem desde que esquecemos de configurar algumas pastas do Laravel/Lumen para serem ignoradas.

Deixem o script de pre-commit-hook assim:

Alterações nas linhas 31, 35 e 38. Foi adicionado o parâmetro --ignore.

Não esqueçam de substituir o arquivo na pasta .git/hooks e renomeá-lo para pre-commit senão irá falhar, no caso de Linux é necessário dar permissão de execução para o arquivo. Esse arquivo que já estava lá anteriormente teve sua cópia realizada através da automação pelo Make. Agora com o hook atualizado teremos o seguinte:

Como podem ver o PHP Code Sniffer rodou sem maiores problemas e o commit foi realizado, agora é só enviar para o GitHub. Lembam né?

git push origin sua_branch

Também podem descomentar a linha 7 do Makefile 😄 para quando alguém baixar o projeto, o Make montar todo o ambiente já funcional.

Uma tarefa de casa para vocês é fazerem todo o fluxo TDD para o método delete encontrado no CategoryController.

O código gerado pela série pode ser encontrado na minha conta do GitHub.

Bom pessoal, esse é o fim da série: Ambiente de Desenvolvimento PHP com Docker ahhhhhh 😢, daqui para frente é com vocês. Um grande abraço a todos. E aguardem novas séries que virão.

E claro, por favor, não deixem de compartilhar, comentar e deixar seu feedback.

Um ótimo 2019 a todos!

Referências:

--

--

Danilo Lutz

Obsessed for learning. OOP, PHP, C# and Python lover. Since 2003 coding...