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