Olá, tudo bem?
Continuando a nossa jornada, onde criaremos uma API de cervejas com o Symfony 3.4, daremos início aos nossos endpoints de recuperação. Um para todas as cervejas e um de recuperação de um cerveja em específico.
Então basicamente, teremos até o fim do artigo:
GET /beers GET /beer/{id}
Episódio passado
Se você caiu de paraquedas neste artigo, em nosso artigo anterior, fizemos o startup de nossa aplicação, bem como as configurações necessárias para nossos retornos em JSON. Dá uma olhadinha lá!
Continuando
Continuando nosso artigo, o primeiro passo é criarmos nossa entidade. Um comentário rápido: o ORM default do Symfony é o Doctrine. Utilizaremos o mesmo para gerenciamento e mapeamento de nossas entidades.
Gerando entidade Beer
O Symfony console nos auxiliará bastante no momento de geração de nossa entidade, facilitando assim, nosso trabalho. Para realizar a geração, execute o comando abaixo na raiz do seu projeto:
bin/console doctrine:generate:entity
Você será guiado por algumas perguntas. Não me delongarei nesse processo, pois criei material em vídeo sobre o assunto. Basta acompanhar abaixo:
Segue abaixo o link da nossa entidade gerada:
Para gerarmos nosso schema/table baseado em nossa entidade, basta executarmos o comando abaixo:
bin/console doctrine:schema:create
Com nosso banco atualizado, vamos à criação do nosso controller que comportará nossos primeiros endpoints!
Gerando & criando BeerController
Sobre a geração de controllers no Symfony, te recomendo outro vídeo para que você possa iniciar. Segue abaixo:
Para gerarmos nosso controller, basta que executemos na raiz do nosso projeto, o comando a seguir:
bin/console generate:controller
Nosso controller terá, a priore, dois métodos. O método index e o método show. Nosso método index retornará todas as cervejas de nossa base, e o método show servirá para mostrarmos os detalhes de uma cerveja em específico.
Vamos por partes aqui! Código do nosso método index:
Um adendo rápido: nosso controller Beer recebe uma annotation para route indicando que a rota para aquele controller é /beers. Juntando com as rotas em cada action, montamos os recursos completos, facilitando assim, a escrita.
Nosso index é bem tranquilo, dado o escopo dessa série. Recuperamos do nosso banco todas as cervejas utilizando o Doctrine, baseado em nossa entidade Beer, que se encontra em nosso APIBundle.
Para retorno de nossos dados, vamos utilizar o JsonResponse, que retorna um json para nós com base no array ou objeto que é passado como primeiro parâmetro em seu construtor.
Para testarmos esse método, vamos iniciar nosso servidor e acessar o link: http://127.0.0.1:8001/api/beers/.
Ops! Tivemos um retorno vazio, mesmo existindo dados no banco. Neste caso, como temos aqui objetos com estrutura complexa para ser exibido, precisamos serializar esse retorno. Para isso, irei utilizar o JSM Serializer para me auxiliar nesse processo.
Para instalarmos, basta executarmos na raiz do nosso projeto, o comando abaixo:
composer require jms/serializer-bundle
Após o download, não esqueça de registrar o bundle em seu arquivo AppKernel.php.
Vamos alterar um pouco nosso método index:
Agora adicionamos no meio do processo, a serialização dos nossos dados vindos do Doctrine. Chamamos o serviço jms_serializer, passando para o método serialize nossos objetos e indicamos o tipo de retorno esperado na serialização.
O retorno da serialização será nossa string json. Vou utilizar desta vez nosso saudoso Response, alterando apenas o Content-Type dos headers de retorno para application/json.
Vamos retornar ao nosso browser e testar novamente, veja abaixo:
Recuperando uma cerveja em específico
Agora que temos nosso endpoint GET /beers, vamos ao nosso endpoint GET /beers/{id}. Este endpoint retorna uma cerveja com base no ID passado.
Veja abaixo:
Nosso método show, que retorna apenas uma cerveja com base no id informado não tem muita diferença aqui, a não ser um ponto em especial.
O ponto em especial aqui é a utilização de um recurso do SF, chamado de parameter converter, onde, ao induzirmos o tipo do parâmetro com um entidade válida, o Symfony tentará retornar o objeto com base no id informado na URL, trazendo assim, no parâmetro beer, nossa cerveja esperada. Caso não exista um dado com o ID informado, um 404 — NOT FOUND é lançado para nós.
Recomendo a leitura do parameter converter clicando aqui.
Ao buscarmos pela cerveja de ID 1, acessando a url http://127.0.0.1:8001/api/beers/1, temos o resultado:
Link para o nosso Controller na faixa:
Conclusão
Chegamos ao ponto proposto para essa segunda etapa. A criação de nossos endpoints de recuperação, todas e uma, em relação a nossas cervejas. Em nosso próximo artigo, vamos criar nossos endpoints de criação e atualização.
Espero que esse artigo possa te ajudar imensamente. Dúvidas? Não deixe de comentar abaixo! Abraços.