Dev (Back & Front)ARTIGO

Construindo uma API com Symfony 3.4 – Parte 1

No seguinte artigo, o autor mostra como construir uma pequena API utilizando o Symfony na versão 3.4.

Olá, tudo bem?

Seja bem vindo a essa pequena série de artigos onde vamos construir uma pequena API utilizando o Symfony, em sua versão 3.4. Apesar de já termos a versão 4 do Symfony, a versão 3.4 participa da mesma filosofia e ainda assim nos permite utilizar o Symfony Flex.

Para este artigo, é importante que você conheça os conceitos básicos de uma aplicação Symfony 3.

Iniciando aplicação

Vamos dar o start em nossa aplicação. Para isso, utilizaremos o symfony installer em nosso terminal. Inicie sua aplicação executando o comando:

symfony new api 3.4

Com isso o installer irá baixar e iniciar nossa aplicação na pasta api, e utilizará a versão 3.4 neste momento.

Configurando nosso banco

Para iniciarmos a configuração do nosso banco, vamos alterar nosso app/config/parameters.yml, adicionando as configurações de nossa base. O meu ficou da seguinte forma:

# This file is auto-generated during the composer install
parameters:
    database_host: 127.0.0.1
    database_port: null
    database_name: api_sf
    database_user: root
    database_password: null
    mailer_transport: smtp
    mailer_host: 127.0.0.1
    mailer_user: null
    mailer_password: null
    secret: 625576ecbfa57b333e69cfcaa029acfe0d61d9c2

O nome do meu banco será api_sf, com user root e senha nulas, no meu caso. Neste caso, o driver default é MySql, banco utilizado neste tutorial.

Para gerarmos nosso banco, basta irmos em nosso terminal e executarmos:

bin/console doctrine:database:create

Bundle API

Irei gerar um bundle para comportar nossa API nesse momento. Veja o vídeo abaixo onde mostro como você pode gerar um novo bundle:

O nome do meu bundle será: APIBundle. Não vou criar ele com intuito de compartilha-lo, por isso, na primeira opção, digito no.

Veja abaixo:

O target folder, do meu Bundle, é a pasta src e a configuração é annotation!

É preciso registrar o bundle em nosso composer.json, basta adiciona-lo na chave autoload como mostro abaixo:

{
  "autoload": {
        "psr-4": {
            "AppBundle\\": "src/AppBundle",
            "APIBundle\\": "src/APIBundle"
        },
        "classmap": [
            "app/AppKernel.php",
            "app/AppCache.php"
        ]
    }
}

Acima, mostro somente a chave autoload. Basta adicionar somente a linha 5 acima e executar um composer dump para regerarmos o autoload.

Linha adicionada ao composer.json:

“APIBundle\\”: “src/APIBundle”

O Symfony configurará tudo para nós, somente a adição do namespace do Bundle que não será carregada no composer.json, por isso realizamos a configuração manualmente.

Gerado nosso bundle, precisamos fazer uma pequena alteração em nosso arquivo de rotas. Ao gerar o bundle nossas rotas foram configuradas, por annotations, apontando para nosso bundle APIBundle.

O que faremos agora é alterar o prefix, apontado para esse bundle. Então de /, mudarei para /api e modificarei o retorno gerado pelas actions, convertendo tudo para json.

Veja abaixo no app/config/routing.yml:

api:
    resource: "@APIBundle/Controller/"
    type:     annotation
    prefix:   /api
    defaults:
            _format: json

app:
    resource: '@AppBundle/Controller/'
    type: annotation

Código embedado GIST: https://gist.github.com/NandoKstroNet/37fd39a4d4f71c0d3d3520fd98f2615a#file-routing-yml

Primeira Execução no Browser

Para concluirmos este artigo, vamos realizar um pequeno retorno em nosso controller principal, dentro de nosso bundle. O controller DefaultController foi gerado e setado com a rota raiz, por meio de annotations.

Vamos retornar um JsonResponse com um pequeno array. Veja abaixo o arquivo src/APIBundle/Controller/DefaultController:

<?php
namespace APIBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
class DefaultController extends Controller
{
    /**
     * @Route("/")
     */
    public function indexAction()
    {
        return new JsonResponse(['msg' => 'Serie Symfony 3.4 API']);
    }
}

O código acima não tem muito mistério, neste momento simplesmente retornamos um JsonResponse que converterá nosso array em um json e retornará isso no browser para nós.

Cabe lembrar que as actions no Symfony devem retornar sempre um objeto response, seja ele do tipo que for.

Com isso, podemos levantar nosso server e acessar o link: http://127.0.0.1:8001/api/.

Comando para levantar o server:

bin/console server:start

Acessando a url, obteremos os resultado abaixo:

Concluindo

Neste artigo, demos nosso ponta pé inicial. Nos próximos artigos, vamos trabalhar com nossa entidade principal, onde criaremos uma API de Cervejas para servir de exemplo aqui em nossa série.

Você pode acompanhar os códigos criados nesta série em meu Github, acessando o link:

Espero que você tenha gostado! Qualquer dúvida, deixe nos comentários abaixo.

Amante das tecnologias e desenvolvimento web, professor na Code Experts Learning é autodidata por natureza e busca sempre as melhores ferramentas para solucionar seus problemas, nunca me atendo a uma só! Web Developer por amor! Sou Zend Certified PHP Engineer - PHP 5.5 e atuo diretamente na criação e coordenação de comunidades Web no estado do Maranhão. Na Associação de Desenvolvedores PHP do estado do Maranhão, atuo como Vice-Diretor ao lado de vários amigos de profissão, fundador da comunidade Front In São Luis, comunidade local para fomentar atividades para a área de FrontEnders do estado e promação de eventos. Sou organizer do Google Developers Group da cidade de São Luis também. Acho muito importante participar de eventos e também organizar! O conhecimento e o networking obtido nos mesmos não têm preço.

Ver perfil