thumbnail

Desvendando o docker-php-stage

Yuri do Monte Yuri do Monte | 5 min de leitura
há 6 dias

Desvendando o docker-php-stage: Como Consumir APIs com PHP Puro e Abstração

Olá, blz?!

Hoje vamos mergulhar no repositório docker-php-stage, um projeto criado para ser um laboratório prático sobre como consumir APIs de forma eficiente e organizada com PHP puro. Se você já se pegou escrevendo código repetitivo para fazer requisições HTTP ou misturando a lógica de acesso a dados com a sua regra de negócio, este post é para você.

Um Repositório em Evolução para Aprendizado

Antes de começarmos, é importante destacar que o docker-php-stage é um projeto em constante evolução. Ele foi criado com o propósito de ser um excelente recurso educacional para desenvolvedores que desejam aprender as melhores práticas de consumo de APIs e padrões de abstração em PHP puro. Novos exemplos, melhorias na arquitetura e funcionalidades adicionais estão sendo continuamente desenvolvidas.

Se você está iniciando sua jornada em desenvolvimento PHP ou busca aprofundar seus conhecimentos em arquitetura de software, este é o lugar perfeito para aprender de forma prática e realista.

O objetivo deste projeto é demonstrar, com exemplos reais, como a abstração e a separação de responsabilidades podem transformar seu código, tornando-o mais limpo, reutilizável e fácil de manter.


A Peça Central: O HttpClient

No coração do nosso projeto, temos a classe HttpClient, localizada em src/Services/HttpClient.php. Em vez de instanciar o Guzzle (ou qualquer outra biblioteca de cliente HTTP) diretamente em todas as classes que precisam fazer uma requisição, nós centralizamos essa responsabilidade em um único serviço.


<?php
namespace Bevith\DockerPhp\Services;

class HttpClient
{
    private $client;

    public function __construct()
    {
        $this->client = new \GuzzleHttp\Client();
    }

    public function get($url, $query = [], $header = [])
    {
        $response = $this->client->request('GET', $url, [
            'query' => $query,
            'headers' => $header
        ]);
        return $response;
    }

    // ... outros métodos como post, put, delete ...
}

Por que isso é importante?


  1. Abstração: Nossa aplicação não sabe qual biblioteca está sendo usada para fazer as requisições. Ela apenas conhece o nosso HttpClient e seus métodos (get, post, etc.). Se um dia quisermos trocar o Guzzle pelo Symfony HTTP Client ou qualquer outro, só precisamos modificar a classe HttpClient. O resto do código permanece intacto.
  2. Reutilização: Qualquer parte do sistema que precise fazer uma chamada HTTP pode simplesmente injetar e usar o HttpClient, evitando duplicação de código.

Consumindo APIs da Maneira Certa: Classes de Serviço

Com o nosso HttpClient pronto, o próximo passo é criar classes específicas para cada API que vamos consumir. No nosso repositório, você encontrará exemplos no diretório src/Core:


  • ViaCEp.php
  • OpenWeather.php
  • JsonPlaceHolder.php
  • E muito mais

Cada uma dessas classes tem uma única responsabilidade: lidar com a complexidade de uma API específica. 

Elas conhecem os endpoints, os parâmetros necessários e como tratar a resposta. Vamos analisar a classe ViaCEp.php:


<?php
namespace Bevith\DockerPhp\Core;
use Bevith\DockerPhp\Services\HttpClient;

class ViaCEp
{
    private $httpClient;

    public function __construct( )
    {
        $this->httpClient = new HttpClient( );
    }

    public function getAddressByZipCode($zipCode)
    {
      $response = $this->httpClient->get("https://viacep.com.br/ws/{$zipCode}/json/" );

      if($response->getStatusCode() === 200){
          return json_decode($response->getBody()->getContents(), true);
      } else {
          return null;
      }
    }
}


Encapsulamento: A classe ViaCEp encapsula toda a lógica de comunicação com a API do ViaCEP. Quem a utiliza não precisa saber a URL do serviço ou como a requisição é feita.

  • Injeção de Dependência (Implícita): A classe ViaCEp depende do HttpClient e o instancia em seu construtor. Em um projeto maior, poderíamos usar um contêiner de injeção de dependência para gerenciar isso automaticamente.
  • Contrato Claro: O método getAddressByZipCode é claro e direto. Ele recebe um CEP e retorna os dados do endereço ou null em caso de falha.


Colocando Tudo para Funcionar

O arquivo public/index.php serve como nosso campo de testes. É aqui que podemos instanciar nossas classes de serviço e ver a mágica acontecer:

<?php
use Bevith\DockerPhp\Core\ViaCEp;

require_once __DIR__ . '/../vendor/autoload.php';

// Instancia e usa o serviço do ViaCEP
$address = (new ViaCEp())->getAddressByZipCode('01001000');

echo '<pre>';
var_dump($address);
echo '</pre>';

O código é limpo, legível e cada componente tem sua responsabilidade bem definida. A lógica de negócio (neste caso, apenas exibir o endereço) está completamente separada da lógica de acesso a dados.

O Ambiente Docker

Para facilitar a vida de quem quer testar o projeto, tudo está containerizado com Docker. O docker-compose.yml orquestra os serviços (a aplicação PHP com Apache e um banco de dados MySQL), e o Dockerfile em docker/php/Dockerfile configura o ambiente PHP, instalando as extensões necessárias e o Composer.

Com apenas dois comandos (cp .env_example .env e docker-compose up -d), qualquer pessoa pode ter o ambiente rodando em sua máquina em poucos minutos.

Conclusão e Próximos Passos

O docker-php-stage é mais do que um simples repositório; é um guia prático e em evolução para escrever código PHP mais robusto e profissional ao interagir com serviços externos. Os princípios de abstração e separação de responsabilidades aqui demonstrados são fundamentais para a construção de aplicações escaláveis e de fácil manutenção.

Se você é um desenvolvedor em busca de aprender as melhores práticas, este repositório oferece exemplos reais e bem estruturados que você pode estudar, modificar e adaptar para seus próprios projetos. Cada classe foi cuidadosamente construída para servir como referência de como escrever código profissional.

Explore os outros exemplos, como o OpenWeather.php, que mostra como passar parâmetros (como a chave da API) de forma segura através de variáveis de ambiente. Sinta-se à vontade para clonar, modificar e experimentar.


Contribuindo para o Aprendizado

O docker-php-stage está em constante evolução,  e isto é fundamental para seu crescimento. 

Quer adicionar um novo exemplo de consumo de API? 

Tem sugestões de melhorias na arquitetura? Encontrou algo que poderia ser explicado melhor? 

Suas contribuições são bem-vindas!

O que você achou dessa abordagem? 

Deixe suas sugestões, dúvidas e contribuições no repositório. Juntos, estamos construindo um recurso educacional de qualidade para toda a comunidade PHP!

Comentários

Realize login para comentar neste post
Este post não possui comentários