Back-End

15 jan, 2018

Construindo uma API com Symfony 3.4 – Parte 1

Publicidade

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.