Conteúdos

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.

Nota
O binário 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.

1
composer create-project symfony/website-skeleton meu_projeto_jogos

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

/images/comecando-com-symfony-4-1.png

  • bin guarda os executáveis do Symfony como o console e o phpunit
  • 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 entrada index.php
  • src as classes criadas por nós ou pela ferramenta de linha de comando console do Symfony
  • templates nossos arquivos de template html ficam aqui
  • tests 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.

1
composer require --dev symfony/browser-kit symfony/css-selector

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 tag h1 com uma class title é ‘Meus Jogos’.
  • Na linha 15 verificamos se existem 3 tags li no nosso código.
  • E por fim na linha 16 verificamos se o primeiro li 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.

O teste falhou, surpreendendo um total de 0 pessoas

O teste falhou, surpreendendo um total de 0 pessoas

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.
Nota

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:

/images/comecando-com-symfony-4-3.png

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:

Uhuu, os testes passaram

Uhuu, os testes passaram

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á.