Começando Com Symfony 4
Olá a todos, hoje vou começar uma série de posts sobre como iniciar um projeto usando o Symfony 4.
Projeto
Nosso projeto será um sistema gerenciador de jogos. Um sistema simples onde teremos os seguintes requisitos:
- Permitir inserir, editar e excluir um jogo na coleção
- Permitir marcar um jogo como “Novo”, “Iniciado” e “Finalizado”
Instalando
Vamos começar com a instalação. Para tanto verifique os requerimentos para rodar o Symfony na página da documentação.
symfony
não é necessário, você pode instalar o Symfony usando só o composer.O Symfony prove dois esqueletos prontos para você iniciar seu projeto. Um deles é voltado para API’s, contendo somente o básico. O outro vem com as ferramentas necessárias para uma aplicação web completa.
Iremos usar esse segundo template.
|
|
Esse comando irá criar o diretório meu_projeto_jogos
com o Symfony e todas as ferramentas instaladas.
Uma pequena explicação sobre os arquivos e pastas
bin
guarda os executáveis do Symfony como oconsole
e ophpunit
config
todos os arquivos de configurações do Symfony, faremos poucas alterações nessa pasta, pois o Flex já faz a maioria das configurações para nós.public
lugar onde ficam armazenados todos os arquivos que o cliente poderá acessar como imagens, css, js, bem como o arquivo de entradaindex.php
src
as classes criadas por nós ou pela ferramenta de linha de comandoconsole
doSymfony
templates
nossos arquivos de template html ficam aquitests
os arquivos de testes unitários e funcionais
Iniciando o projeto
Teste
Agora que já temos o projeto instalado, vamos começar fazendo o teste funcional para verificar nossa página inicial. Ela terá uma listagem simples com os jogos já salvos.
Para o teste funcional, vamos usar uma biblioteca do Symfony que permitirá fazer asserts dentro do html de resposta.
|
|
Agora crie um arquivo chamado: tests/Functional/HomeTest.php
com o seguinte conteúdo:
- Na linha
11
criamos o cliente que inicia o Symfony para fazermos os testes. - Na linha
12
fazemos a requisição e recebemos o Crawler como retorno. Ele nos permite navegar pelo HTML retornado. - Na linha
13
checamos se a página retornou 200, indicando que deu tudo certo na requisição. - Na linha
14
verificamos se o conteúdo de uma tagh1
com uma classtitle
é ‘Meus Jogos’. - Na linha
15
verificamos se existem 3 tagsli
no nosso código. - E por fim na linha
16
verificamos se o primeiroli
tem como conteúdo ‘Super Mario World - Novo’.
E rode o phpunit bin/phpunit
Como será a primeira vez que roda o programa, o Symfony irá instalar o phpunit.
Agora que nosso teste falhou, vamos partir para a implementação.
Resolvendo parte a parte dos problemas, o primeiro é que está retornando 404.
Rotas
O Symfony possui duas formas principais de configurar as suas rotas:
- Pelo arquivo de configuração
config/routes.yaml
- Usando
annotations
Nesse projeto irei usar o arquivo config/routes.yaml
pois acho o resultado mais “limpo”. Caso queira usar as annotations
veja neste link como.
Vamos editar o arquivo config/routes.yaml
com o seguinte conteúdo:
- A primeira linha é o apelido para a rota que estamos criando. Nesse caso
index
. - Na segunda linha está a rota em si.
- E na terceira linha está o controller que irá responder a essa rota.
O Symfony também suporta especificar o método dentro do controller que irá responder a rota. Por exemplo caso a classe App\Controller\HomeController
tivesse um método public function indexRoute()
na opção de controller ficaria: App\Controller\HomeController::indexRoute
.
Pessoalmente eu prefiro uma segunda abordagem, onde se omite o nome do método, e o controller deve ter um método __invoke()
. Assim teremos uma classe por rota, deixando-as menores.
Com o controller configurado no routes.yaml
iremos agora criar o controller.
Controller
O Symfony possui comandos para gerar código. No caso para criar um controller execute o comando php bin/console make:controller <nome do controller>
no nosso caso ficará: php bin/console make:controller HomeController
O Symfony irá criar a classe e o template para ela.
Perceba que ele criou a anotação para a rota também. Por isso vamos remover as linhas 6 e 10 até a 12. Vamos também renomear o método index
para __invoke
, ficando assim:
Podemos rodar os testes novamente:
Agora foi encontrado a rota, e ela está retornando status 200. Só que o conteúdo ainda não é o esperado.
Template
Vamos alterar nosso template templates/home/index.html.twig
para o seguinte conteúdo:
Agora temos um template com o conteúdo esperado.
Ao rodar os testes:
Mas é claro que roubamos aqui. Os dados estão direto no HTML e não é isso que queremos. O objetivo é pegar os dados dos jogos de um banco de dados.
Mas para isso vamos ter outro post sobre como configurar e usar o Doctrine no nosso projeto.
Você pode acessar o código feito até aqui em: https://github.com/vanildosouto/comecando-com-symfony-4/tree/post1
Até lá.