PHP

Boas Práticas de Documentação de APIs PHP com OpenAPI e Swagger para Times Ágeis

8 min de leitura

Boas Práticas de Documentação de APIs PHP com OpenAPI e Swagger para Times Ágeis

O que é OpenAPI e Swagger? OpenAPI é uma especificação aberta para descrever APIs REST de forma padronizada e legível por máquinas. Swagger, na verdade, é o nome da ferramenta que surgiu antes da especificação OpenAPI ser oficializada pela Linux Foundation. Hoje, Swagger refere-se ao conjunto de ferramentas do SmartBear que implementam a especificação OpenAPI, incluindo a famosa interface Swagger UI para visualizar e testar endpoints. Quando você documenta uma API com OpenAPI/Swagger, está criando um contrato que descreve todos os endpoints, parâmetros, respostas, autenticação e modelos de dados. Esse documento pode ser consumido por clientes, geradores de código e ferramentas de teste automaticamente, economizando tempo e reduzindo erros de integração. Configurando OpenAPI em um Projeto PHP Instalação e Dependências A forma mais prática de trabalhar com OpenAPI em PHP é usar a biblioteca , que lê anotações diretamente do seu código. Instale via Composer: Também vamos usar o para visualizar a documentação: Estrutura Básica com Anotações No Swagger-PHP, você

<h2>O que é OpenAPI e Swagger?</h2>

<p>OpenAPI é uma especificação aberta para descrever APIs REST de forma padronizada e legível por máquinas. Swagger, na verdade, é o nome da ferramenta que surgiu antes da especificação OpenAPI ser oficializada pela Linux Foundation. Hoje, Swagger refere-se ao conjunto de ferramentas do SmartBear que implementam a especificação OpenAPI, incluindo a famosa interface Swagger UI para visualizar e testar endpoints.</p>

<p>Quando você documenta uma API com OpenAPI/Swagger, está criando um contrato que descreve todos os endpoints, parâmetros, respostas, autenticação e modelos de dados. Esse documento pode ser consumido por clientes, geradores de código e ferramentas de teste automaticamente, economizando tempo e reduzindo erros de integração.</p>

<h2>Configurando OpenAPI em um Projeto PHP</h2>

<h3>Instalação e Dependências</h3>

<p>A forma mais prática de trabalhar com OpenAPI em PHP é usar a biblioteca <code>zircote/swagger-php</code>, que lê anotações diretamente do seu código. Instale via Composer:</p>

<pre><code class="language-bash">composer require zircote/swagger-php</code></pre>

<p>Também vamos usar o <code>swagger-ui</code> para visualizar a documentação:</p>

<pre><code class="language-bash">composer require swagger-api/swagger-ui</code></pre>

<h3>Estrutura Básica com Anotações</h3>

<p>No Swagger-PHP, você documenta sua API usando anotações PHP. Aqui está um exemplo de um controlador simples com dois endpoints:</p>

<pre><code class="language-php">&lt;?php

namespace App\Controllers;

/**

  • @OA\Info(title=&quot;API de Produtos&quot;, version=&quot;1.0.0&quot;)
  • @OA\Server(url=&quot;http://localhost:8000&quot;, description=&quot;Servidor de desenvolvimento&quot;)

*/

class ProdutoController

{

/**

  • @OA\Get(
  • path=&quot;/api/produtos&quot;,
  • summary=&quot;Lista todos os produtos&quot;,
  • @OA\Response(
  • response=200,
  • description=&quot;Lista de produtos retornada com sucesso&quot;,
  • @OA\JsonContent(
  • type=&quot;array&quot;,
  • @OA\Items(ref=&quot;#/components/schemas/Produto&quot;)
  • )
  • )
  • )

*/

public function listar()

{

return json_encode([

[&#039;id&#039; =&gt; 1, &#039;nome&#039; =&gt; &#039;Notebook&#039;, &#039;preco&#039; =&gt; 2500.00],

[&#039;id&#039; =&gt; 2, &#039;nome&#039; =&gt; &#039;Mouse&#039;, &#039;preco&#039; =&gt; 50.00]

]);

}

/**

  • @OA\Post(
  • path=&quot;/api/produtos&quot;,
  • summary=&quot;Criar novo produto&quot;,
  • @OA\RequestBody(
  • required=true,
  • @OA\JsonContent(ref=&quot;#/components/schemas/ProdutoCreate&quot;)
  • ),
  • @OA\Response(
  • response=201,
  • description=&quot;Produto criado com sucesso&quot;,
  • @OA\JsonContent(ref=&quot;#/components/schemas/Produto&quot;)
  • )
  • )

*/

public function criar()

{

$dados = json_decode(file_get_contents(&#039;php://input&#039;), true);

return json_encode([&#039;id&#039; =&gt; 3, &#039;nome&#039; =&gt; $dados[&#039;nome&#039;], &#039;preco&#039; =&gt; $dados[&#039;preco&#039;]]);

}

}</code></pre>

<h3>Definindo Schemas de Dados</h3>

<p>Os schemas descrevem a estrutura dos seus objetos. Defina-os como classes com anotações:</p>

<pre><code class="language-php">&lt;?php

namespace App\Models;

/**

  • @OA\Schema(
  • schema=&quot;Produto&quot;,
  • type=&quot;object&quot;,
  • required={&quot;id&quot;, &quot;nome&quot;, &quot;preco&quot;},
  • @OA\Property(property=&quot;id&quot;, type=&quot;integer&quot;, example=1),
  • @OA\Property(property=&quot;nome&quot;, type=&quot;string&quot;, example=&quot;Notebook&quot;),
  • @OA\Property(property=&quot;preco&quot;, type=&quot;number&quot;, format=&quot;float&quot;, example=2500.00)
  • )

*/

class Produto

{

public int $id;

public string $nome;

public float $preco;

}

/**

  • @OA\Schema(
  • schema=&quot;ProdutoCreate&quot;,
  • type=&quot;object&quot;,
  • required={&quot;nome&quot;, &quot;preco&quot;},
  • @OA\Property(property=&quot;nome&quot;, type=&quot;string&quot;, example=&quot;Teclado&quot;),
  • @OA\Property(property=&quot;preco&quot;, type=&quot;number&quot;, format=&quot;float&quot;, example=150.00)
  • )

*/

class ProdutoCreate

{

public string $nome;

public float $preco;

}</code></pre>

<h2>Gerando e Servindo a Documentação</h2>

<h3>Gerando o JSON do OpenAPI</h3>

<p>Crie um script PHP na raiz do projeto (ex: <code>openapi.php</code>) que gera o arquivo de especificação:</p>

<pre><code class="language-php">&lt;?php

require_once __DIR__ . &#039;/vendor/autoload.php&#039;;

use OpenAPI\Generator;

$openapi = Generator::scan([__DIR__ . &#039;/app&#039;]);

header(&#039;Content-Type: application/json&#039;);

echo json_encode($openapi-&gt;toArray(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);</code></pre>

<p>Execute via CLI: <code>php openapi.php &gt; openapi.json</code></p>

<h3>Servindo Swagger UI</h3>

<p>Copie o Swagger UI para sua pasta pública e crie um arquivo <code>swagger.html</code>:</p>

<pre><code class="language-html">&lt;!DOCTYPE html&gt;

&lt;html&gt;

&lt;head&gt;

&lt;title&gt;API Documentation&lt;/title&gt;

&lt;meta charset=&quot;utf-8&quot;/&gt;

&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui.css&quot;&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;div id=&quot;swagger-ui&quot;&gt;&lt;/div&gt;

&lt;script src=&quot;https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui.bundle.js&quot;&gt;&lt;/script&gt;

&lt;script&gt;

SwaggerUIBundle({

url: &quot;/openapi.json&quot;,

dom_id: &#039;#swagger-ui&#039;,

presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset]

});

&lt;/script&gt;

&lt;/body&gt;

&lt;/html&gt;</code></pre>

<h2>Boas Práticas e Dicas Práticas</h2>

<p>Documente parâmetros de query e path de forma clara. Se seu endpoint recebe filtros, declare-os explicitamente com suas restrições:</p>

<pre><code class="language-php">/**

  • @OA\Get(
  • path=&quot;/api/produtos&quot;,
  • @OA\Parameter(
  • name=&quot;categoria&quot;,
  • in=&quot;query&quot;,
  • description=&quot;Filtrar por categoria&quot;,
  • @OA\Schema(type=&quot;string&quot;)
  • ),
  • @OA\Parameter(
  • name=&quot;preco_max&quot;,
  • in=&quot;query&quot;,
  • description=&quot;Preço máximo&quot;,
  • @OA\Schema(type=&quot;number&quot;, format=&quot;float&quot;)
  • )
  • )

*/

public function filtrar() { }</code></pre>

<p>Sempre documente códigos de erro e exceções. Use diferentes status codes (400, 401, 404, 500) e descreva o que cada um significa em seu contexto. Mantenha a documentação atualizada junto com o código — quando você muda um endpoint, atualize a anotação imediatamente. Isso evita que a documentação fique obsoleta e confunda quem está consumindo a API.</p>

<h2>Conclusão</h2>

<p>Documentar APIs com OpenAPI/Swagger em PHP não é apenas bom para seus usuários — é um investimento na qualidade e manutenibilidade do seu código. Você aprende que a especificação OpenAPI funciona como um contrato vivo entre seu código e seus consumidores, mantendo tudo sincronizado. Swagger-PHP transforma suas anotações em documentação interativa automaticamente, economizando horas de esforço manual. Por fim, a Swagger UI oferece uma interface testável onde qualquer desenvolvedor pode explorar seus endpoints sem abrir uma única linha de código.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://spec.openapis.org/oas/v3.0.3" target="_blank" rel="noopener noreferrer">OpenAPI Specification Oficial</a></li>

<li><a href="https://github.com/zircote/swagger-php" target="_blank" rel="noopener noreferrer">Swagger-PHP Documentation</a></li>

<li><a href="https://github.com/swagger-api/swagger-ui" target="_blank" rel="noopener noreferrer">Swagger UI GitHub</a></li>

<li><a href="https://swagger.io/resources/articles/best-practices-in-api-documentation/" target="_blank" rel="noopener noreferrer">Best Practices for Documenting APIs</a></li>

<li><a href="https://smartbear.com/blog/api-design/documenting-apis-with-openapi/" target="_blank" rel="noopener noreferrer">PHP OpenAPI Guide - SmartBear</a></li>

</ul>

Comentários

Mais em PHP

CRUD Completo com PDO: Create, Read, Update, Delete: Do Básico ao Avançado
CRUD Completo com PDO: Create, Read, Update, Delete: Do Básico ao Avançado

Preparando o Ambiente: Conexão com PDO A PDO (PHP Data Objects) é uma camada...

Construindo uma API REST Completa com Laravel na Prática
Construindo uma API REST Completa com Laravel na Prática

Fundações: Preparando o Ambiente Antes de construir sua API REST em Laravel,...

Boas Práticas de Eloquent ORM: Models, Relacionamentos e Scopes para Times Ágeis
Boas Práticas de Eloquent ORM: Models, Relacionamentos e Scopes para Times Ágeis

Introdução ao Eloquent ORM O Eloquent é o Object-Relational Mapping (ORM) pad...