Ambiente de Desenvolvimento PHP com Docker - Parte Final - Laravel/Lumen & TDD & PHP Unit
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:
- Parte 1 desta série.
- Parte 2 desta série.
- Parte 3 desta série.
- Laravel ou Lumen: O Lumen nada mais é que uma versão resumida do Laravel, idealizada com o foco na construção de APIs REST (ou Representational State Transfer). Para quem não sabe o Laravel é um framework padrão MVC (Model-Veiw-Controller).
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:
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
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á!
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.
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.
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:
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:
- https://docs.docker.com/
- https://docs.docker.com/compose/
- https://hub.docker.com/_/php/
- https://hub.docker.com/r/jakzal/phpqa/
- https://git-scm.com/
- https://github.com/
- https://code.visualstudio.com/
- https://www.mysql.com/products/workbench/
- https://github.com/squizlabs/PHP_CodeSniffer
- https://www.phpmyadmin.net/
- https://hub.docker.com/r/phpmyadmin/phpmyadmin/
- https://getcomposer.org/
- https://packagist.org/
- http://tdd.caelum.com.br/
- https://lumen.laravel.com/docs
- Um pouco de experiência pessoal…