adhenrique / openkit
Uma biblioteca elegante com interface fluente para gerar documentação OpenAPI (Swagger) em aplicações Laravel.
Installs: 3
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:laravel-package
pkg:composer/adhenrique/openkit
Requires
- php: ^8.2
- illuminate/console: ^10.0 | ^11.0 | ^12.0
- illuminate/filesystem: ^10.0 | ^11.0 | ^12.0
- illuminate/routing: ^10.0 | ^11.0 | ^12.0
- illuminate/support: ^10.0 | ^11.0 | ^12.0
- illuminate/view: ^10.0 | ^11.0 | ^12.0
Requires (Dev)
- larastan/larastan: ^2.11
- laravel/pint: ^1.25
- orchestra/testbench: ^9.0
- phpunit/phpunit: ^11.0
- projektgopher/whisky: ^0.7.4
README
OpenKit é uma biblioteca elegante com interface fluente para gerar documentação OpenAPI (v3.0) para aplicações Laravel.
Cansado de poluir seus Controllers com centenas de linhas de anotações #[OA]? OpenKit resolve esse problema adotando uma filosofia diferente: Sua documentação de API é um contrato, e deve ser tratada como um cidadão de primeira classe, separada da sua lógica de implementação.
Com OpenKit, você define sua API em um local central (routes/openkit.php) usando uma API fluente e expressiva em PHP puro.
🌟 Principais Funcionalidades
- Interface Fluente Elegante: Descreva sua API com uma sintaxe encadeada e legível.
- Contrato Centralizado: Mantenha seus Controllers limpos. Toda a sua documentação vive em um só lugar.
- Schemas Reutilizáveis: Defina seus DTOs (
User,Product, etc.) uma vez e referencie-os em qualquer lugar ($ref). - Integração com Laravel: Configuração zero com auto-discovery de
ServiceProvidereFacade. - Suporte Completo: Define
paths,parameters,requestBodies,responses,securitySchemes(Bearer, API Key) e mais. - Upload de Arquivos: Suporte nativo para
multipart/form-data. - Geração sob Demanda: Gere seu
openapi.jsoncom um simples comando artisan. - UI Pronta para Uso: Acessa uma bela UI (Swagger UI) em uma rota configurável, sem esforço.
📦 Instalação
Você pode instalar o pacote via Composer:
composer require adhenrique/openkit
Configuração
O OpenKit usa o Package Auto-Discovery do Laravel. O ServiceProvider e a Facade serão registrados automaticamente.
Para publicar o arquivo de configuração, rode:
php artisan vendor:publish --provider="OpenKit\OpenKitServiceProvider" --tag="openkit-config"
Isso criará o arquivo config/openkit.php, onde você pode definir:
- A informação base da sua API (info.title, info.version, etc.).
- O prefixo da rota da UI (path).
- O local do seu arquivo de definições (definitions).
🏁 Guia Rápido (Getting Started)
1. Crie seu Arquivo de Definições
Por padrão, o OpenKit espera um arquivo em routes/openkit.php. Crie este arquivo.
2. Defina sua API
Adicione suas definições usando a facade OpenKit.
routes/openkit.php
<?php use OpenKit\Facades\OpenKit; use OpenKit\Builders\ParameterBuilder; use OpenKit\Builders\ResponseBuilder; use OpenKit\Builders\RequestBodyBuilder; /* |-------------------------------------------------------------------------- | Definições Globais |-------------------------------------------------------------------------- | Defina seus componentes reutilizáveis aqui: Tags, Schemas e Segurança. */ // Defina as "categorias" da sua API OpenKit::defineTag('Users', 'Operações relacionadas a usuários'); OpenKit::defineTag('Products', 'Gerenciamento de produtos'); // Defina seus Schemas (DTOs) reutilizáveis OpenKit::defineSchema('User', [ 'type' => 'object', 'properties' => [ 'id' => ['type' => 'integer', 'format' => 'int64'], 'name' => ['type' => 'string', 'example' => 'João da Silva'], 'email' => ['type' => 'string', 'format' => 'email'], ], ]); // Defina seus esquemas de segurança OpenKit::defineBearerAuth('bearerAuth'); // O nome 'bearerAuth' é um ID interno /* |-------------------------------------------------------------------------- | Definições de Rotas (Paths) |-------------------------------------------------------------------------- | Descreva cada endpoint da sua API. */ // Exemplo de rota GET OpenKit::path('/api/users/{id}', 'get') ->tag('Users') ->summary('Obter um usuário específico') ->operationId('getUserById') ->securedBy('bearerAuth') // Aplica a segurança definida acima ->withParameter('id', 'path', function (ParameterBuilder $param) { $param->description('ID do usuário') ->schema(['type' => 'integer']); // 'required' é automático para 'path' }) ->withResponse(200, function (ResponseBuilder $res) { $res->description('Usuário encontrado') // Usa um schema reutilizável ->jsonContent(['$ref' => '#/components/schemas/User']); }) ->withResponse(404, function (ResponseBuilder $res) { $res->description('Usuário não encontrado'); }); // Exemplo de rota POST OpenKit::path('/api/users', 'post') ->tag('Users') ->summary('Criar um novo usuário') ->securedBy('bearerAuth') ->withRequestBody(function (RequestBodyBuilder $body) { $body->required() ->description('Dados do novo usuário') // Usa o mesmo schema, mas você também pode definir inline ->jsonContent(['$ref' => '#/components/schemas/User']); }) ->withResponse(201, function (ResponseBuilder $res) { $res->description('Usuário criado com sucesso') ->jsonContent(['$ref' => '#/components/schemas/User']); });
3. Gere o JSON
Rode o comando Artisan para processar suas definições e gerar o arquivo JSON.
php artisan openkit:generate
Isso criará o arquivo openapi.json na sua pasta public/ (ou o que estiver definido no config).
4. Veja sua Documentação
Visite a rota da UI no seu navegador: http://seu-app.test/openkit/docs
(O prefixo /openkit/docs pode ser alterado no arquivo config/openkit.php).
📚 Referência da API Fluente
Definições Globais
Use estes métodos no escopo global do seu arquivo de definições.
OpenKit::defineTag(string $name, string $description)Cria uma categoria para agrupar suas rotas.OpenKit::defineSchema(string $name, array $schema)Define um schema reutilizável. Você pode usar$refpara referenciá-lo:['$ref' => '#/components/schemas/SeuNome'].OpenKit::defineBearerAuth(string $name, string $format = 'JWT')Define um esquema de segurançahttp(Bearer Token).OpenKit::defineApiKeyHeader(string $name, string $headerName)Define um esquema de segurançaapiKey(ex:X-API-KEY).OpenKit::defineSecurityScheme(string $name, array $definition)Define qualquer outro esquema de segurança customizado do OpenAPI.
Definição de Rotas
OpenKit::path(string $uri, string $method)Inicia a definição de uma nova operação (rota). Retorna umOperationBuilder.
OperationBuilder
Métodos disponíveis após chamar OpenKit::path(...).
->tag(string $tagName): Adiciona a operação a uma Tag (definida globalmente).->summary(string $summary): Um título curto para a operação.->description(string $description): Uma descrição longa.->operationId(string $id): Um ID único (útil para geradores de código).->deprecated(bool $isDeprecated = true): Marca a rota como obsoleta.->securedBy(string $name, array $scopes = []): Aplica um esquema de segurança (definido globalmente) a esta rota.
Parâmetros (Parâmetros de Rota e Query)
->withParameter(string $name, string $in, callable $callback)$in: Onde o parâmetro está. Pode ser'path','query','header', ou'cookie'.$callback: Recebe umParameterBuilder.
->withParameter('status', 'query', function (ParameterBuilder $param) { $param->description('Filtra por status') ->required(false) // Opcional para 'query' ->schema([ 'type' => 'string', 'enum' => ['active', 'inactive'] ]); })
Métodos do ParameterBuilder: description(), required(), deprecated(), schema(), example().
Request Body (Payloads de POST/PUT/PATCH)
->withRequestBody(callable $callback)$callback: Recebe umRequestBodyBuilder.
->withRequestBody(function (RequestBodyBuilder $body) { $body->required() ->description('Payload do usuário'); // Use jsonContent() para APIs JSON $body->jsonContent([ 'type' => 'object', 'properties' => [...] ]); // Ou use multipartFormData() para uploads $body->multipartFormData([ 'avatar' => ['type' => 'string', 'format' => 'binary'], 'name' => ['type' => 'string'] ]); })
Métodos do RequestBodyBuilder: description(), required(), jsonContent(array $schema), multipartFormData(array $properties).
Respostas (Responses)
- ->withResponse(int $statusCode, callable $callback)
$statusCode: O código HTTP (ex: 200, 201, 404).$callback: Recebe umResponseBuilder.
->withResponse(200, function (ResponseBuilder $res) { $res->description('Operação bem-sucedida') ->jsonContent(['$ref' => '#/components/schemas/User']) ->header('X-Rate-Limit', [ 'description' => 'Requisições restantes', 'schema' => ['type' => 'integer'] ]); }) ->withResponse(404, function (ResponseBuilder $res) { // Respostas sem conteúdo só precisam de descrição $res->description('Não encontrado'); })
Métodos do ResponseBuilder: description(), jsonContent(array $schema), content(string $mimeType, array $schema), header(string $name, array $definition).
🧪 Testes (para Contribuidores)
O pacote utiliza Orchestra Testbench para testes de feature.
# Instalar dependências (incluindo --dev) composer install # Rodar a suíte de testes composer test
🤝 Contribuição
Contribuições são bem-vindas! Por favor, abra uma issue para discutir sua ideia ou um pull request com suas alterações.
📄 Licença
O OpenKit é um software de código aberto licenciado sob a Licença MIT.