hopheartsceo/laravel-postman-exporter
最新稳定版本:v1.1.0
Composer 安装命令:
composer require hopheartsceo/laravel-postman-exporter
包简介
Automatically generate Postman v2.1 collections from your Laravel application routes, controllers, and FormRequest validations.
README 文档
README
Automatically generate Postman Collection v2.1 files and OpenAPI 3.0 specifications from your Laravel application routes, controllers, and FormRequest validations — complete with hierarchical folder grouping and response examples.
✨ Features
- 🔍 Route Scanning — Automatically reads all registered API routes
- 📝 Request Analysis — Extracts validation rules from FormRequest classes and inline
$request->validate()calls - 🎯 Smart Example Data — Generates realistic sample values based on validation rules and field names
- 🔐 Authentication Detection — Automatically adds auth headers based on middleware (Sanctum, Passport, etc.)
- 📁 Hierarchical Grouping — Organizes requests into nested folders based on route prefixes
- 📋 Response Examples — Extracts response structures from PHPDoc, API Resources,
response()->json(), and Eloquent models - 📄 OpenAPI Support — Export your API as a valid OpenAPI 3.0.3 specification
- 🚀 Postman Upload — Optionally upload collections directly via the Postman API
- ⚡ Artisan Command — Beautiful CLI with progress indicators and colored output
📦 Installation
You can install the package via composer:
composer require hopheartsceo/laravel-postman-exporter --dev
Installation from GitHub (Development)
If you haven't published to Packagist yet, add this to your composer.json:
"repositories": [ { "type": "vcs", "url": "https://github.com/hopheartsceo/laravel-postman-exporter" } ], "require": { "hopheartsceo/laravel-postman-exporter": "dev-main" }
Publish the configuration file:
php artisan vendor:publish --tag=postman-exporter-config
🚀 Usage
Artisan Command
# Export as Postman Collection (default) php artisan postman:export # Export as OpenAPI 3.0 specification php artisan postman:export --format=openapi # Custom output path php artisan postman:export --output=./docs/api-spec.json # Group routes by prefix (works for both formats) php artisan postman:export --group-by-prefix # Include response examples (Postman only currently) php artisan postman:export --with-responses
Facade API
use Hopheartsceo\PostmanExporter\Facades\PostmanExporter; // Generate Postman Collection (default) $collection = PostmanExporter::generate(); // Generate OpenAPI spec $openapi = PostmanExporter::generate('openapi'); // Generate and save to file $path = PostmanExporter::save('/path/to/collection.json'); // Generate and upload to Postman $result = PostmanExporter::upload('your-api-key');
⚙️ Configuration
After publishing, edit config/postman-exporter.php:
| Option | Type | Default | Description |
|---|---|---|---|
base_url |
string | env('APP_URL') |
Base URL for all requests |
default_headers |
array | Accept + Content-Type JSON | Default headers on every request |
output_path |
string | storage/app/postman-collection.json |
Default output path |
collection_name |
string | App name + " API Collection" | Name of the Postman collection |
grouping |
array | (see below) | Folder grouping configuration |
responses |
array | (see below) | Response examples configuration |
include_web_routes |
bool | false |
Include non-API routes |
postman_api_key |
string | '' |
Postman API key for uploads |
enable_upload |
bool | false |
Auto-upload after generation |
Folder Grouping
Routes are grouped into flat, single-level folders by the first segment of the URI. No nesting is created — every route belongs to exactly one top-level folder.
'grouping' => [ 'enabled' => true, 'strategy' => 'prefix', // Only 'prefix' strategy supported 'fallback_folder' => 'general', // Folder for unprefixed / root routes ],
How it works:
| URI | Folder |
|---|---|
api/users |
api |
api/users/{id} |
api |
auth/login |
auth |
auth/logout |
auth |
status |
general (fallback) |
/{id} |
general (fallback) |
- The first segment of the URI (
explode('/', $uri)[0]) becomes the folder name. - Routes whose first segment is empty or a parameter (e.g.
{id}) go to the fallback folder. - There are no root-level requests — every request lives inside a folder.
- There are no nested folders — the structure is always flat.
Response Examples
Response examples are extracted automatically from your controller methods and attached to each Postman request item.
'responses' => [ 'enabled' => true, 'fallback_status' => 200, 'fallback_body' => ['message' => 'Success'], ],
Or enable at export time with the --with-responses flag:
php artisan postman:export --with-responses
Extraction priority (highest to lowest):
-
PHPDoc
@response— Parses@responsetags with optional status codes:/** * @response 200 {"id": 1, "name": "John Doe"} * @response {"data": []} */ public function index() { ... }
-
API Resource — Detects
return new UserResource(...)patterns and reads the Resource's$fillable/$visiblefields. -
response()->json()— Parses inlineresponse()->json([...], 200)calls to extract the body and status code. -
Eloquent Model — Detects
return User::find(...)patterns and generates example data from the model's$fillablefields. -
Fallback — Uses the configured
fallback_statusandfallback_body.
Generated response format in Postman:
{
"response": [
{
"name": "Success Response",
"originalRequest": { "method": "GET", "url": { ... } },
"status": "OK",
"code": 200,
"_postman_previewlanguage": "json",
"header": [
{ "key": "Content-Type", "value": "application/json" }
],
"body": "{\"id\": 1, \"name\": \"John Doe\"}"
}
]
}
Route Filters
'route_filters' => [ 'include_prefixes' => [], // Only include these prefixes 'exclude_prefixes' => ['_ignition'], // Exclude these prefixes 'include_middleware' => [], // Only include routes with these middleware 'exclude_middleware' => [], // Exclude routes with these middleware ],
Middleware to Headers Map
'middleware_to_headers_map' => [ 'auth:sanctum' => [ 'Authorization' => 'Bearer {{token}}', ], 'auth:api' => [ 'Authorization' => 'Bearer {{token}}', ], ],
📄 Example Output
The generated collection follows the Postman Collection v2.1 schema. Folders are flat (single-level) and each request includes response examples:
{
"info": {
"name": "My App API Collection",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "api",
"item": [
{
"name": "users.index",
"request": {
"method": "GET",
"url": {
"raw": "{{base_url}}/api/users",
"host": ["{{base_url}}"],
"path": ["api", "users"]
},
"header": [
{ "key": "Accept", "value": "application/json" },
{ "key": "Authorization", "value": "Bearer {{token}}" }
]
},
"response": [
{
"name": "Success Response",
"originalRequest": {
"method": "GET",
"url": {
"raw": "{{base_url}}/api/users",
"host": ["{{base_url}}"],
"path": ["api", "users"]
}
},
"status": "OK",
"code": 200,
"_postman_previewlanguage": "json",
"header": [
{ "key": "Content-Type", "value": "application/json" }
],
"body": "{\"data\": [{\"id\": 1, \"name\": \"John Doe\"}]}"
}
]
}
],
"description": "Routes for api"
},
{
"name": "general",
"item": [
{
"name": "GET Status",
"request": {
"method": "GET",
"url": {
"raw": "{{base_url}}/status",
"host": ["{{base_url}}"],
"path": ["status"]
}
},
"response": [
{
"name": "Success Response",
"originalRequest": {
"method": "GET",
"url": {
"raw": "{{base_url}}/status",
"host": ["{{base_url}}"],
"path": ["status"]
}
},
"status": "OK",
"code": 200,
"_postman_previewlanguage": "json",
"header": [
{ "key": "Content-Type", "value": "application/json" }
],
"body": "{\"message\": \"Success\"}"
}
]
}
],
"description": "Routes for general"
}
],
"variable": [
{ "key": "base_url", "value": "http://localhost" },
{ "key": "token", "value": "your-auth-token-here" }
]
}
See
examples/sample-collection.jsonfor a full example with multiple folders and response examples.
🧪 Testing
composer test # or vendor/bin/phpunit
🏗️ Architecture
| Service | Responsibility |
|---|---|
RouteScannerService |
Scans Laravel routes via the Router; extracts return types, PHPDoc, and API Resource usage |
RequestAnalyzerService |
Extracts FormRequest/inline validation rules |
ValidationParserService |
Parses validation rules into structured format |
ExampleDataGeneratorService |
Generates realistic sample values |
FolderOrganizerService |
Groups routes into flat, single-level folders by first URI segment |
ResponseExtractorService |
Analyzes controller methods to extract response structures (PHPDoc → API Resource → JSON → Model → Fallback) |
ExampleResponseGeneratorService |
Converts extracted response data into Postman-formatted response arrays |
PostmanCollectionBuilderService |
Builds Postman v2.1 JSON structure with folders and response examples |
PostmanUploaderService |
Uploads collections to Postman API |
📋 Requirements
- PHP 8.1+
- Laravel 10, 11, or 12
📝 License
MIT License. See LICENSE for details.
统计信息
- 总下载量: 16
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 3
- 点击次数: 4
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-03-08