API Reference
Programmatic usage and API reference for Laravel Spectrum.
📋 Basic Usage
Programmatic Execution
use LaravelSpectrum\Facades\Spectrum;
use LaravelSpectrum\Generators\OpenApiGenerator;
use LaravelSpectrum\Analyzers\RouteAnalyzer;
// Analyze routes
$analyzer = app(RouteAnalyzer::class);
$routes = $analyzer->analyze();
// Generate OpenAPI document
$generator = app(OpenApiGenerator::class);
$openapi = $generator->generate($routes);
// Save to file
file_put_contents(
storage_path('app/spectrum/openapi.json'),
json_encode($openapi, JSON_PRETTY_PRINT)
);
Using Facades
use LaravelSpectrum\Facades\Spectrum;
// Generate documentation
$openapi = Spectrum::generate();
// Only specific route patterns
$openapi = Spectrum::generate(['api/v1/*']);
// With options
$openapi = Spectrum::generate(['api/*'], [
'includeVendor' => false,
'useCache' => true,
]);
🔍 Analyzers
RouteAnalyzer
Main class for analyzing route information.
namespace LaravelSpectrum\Analyzers;
class RouteAnalyzer
{
/**
* Analyze all routes
*
* @param array $patterns Route patterns to include
* @param array $excludes Route patterns to exclude
* @return array
*/
public function analyze(array $patterns = [], array $excludes = []): array;
/**
* Analyze a single route
*
* @param \Illuminate\Routing\Route $route
* @return array|null
*/
public function analyzeRoute($route): ?array;
}
Usage Examples:
$analyzer = app(RouteAnalyzer::class);
// Analyze all API routes
$routes = $analyzer->analyze(['api/*']);
// Exclude specific routes
$routes = $analyzer->analyze(['api/*'], ['api/debug/*']);
// Analyze single route
$route = Route::getRoutes()->getByName('users.index');
$analyzed = $analyzer->analyzeRoute($route);
FormRequestAnalyzer
Extracts validation rules from FormRequest classes.
namespace LaravelSpectrum\Analyzers;
class FormRequestAnalyzer
{
/**
* Analyze FormRequest
*
* @param string $requestClass
* @return array
*/
public function analyze(string $requestClass): array;
/**
* Analyze including conditional rules
*
* @param string $requestClass
* @return array
*/
public function analyzeWithConditionalRules(string $requestClass): array;
}
Usage Examples:
$analyzer = app(FormRequestAnalyzer::class);
// Basic analysis
$parameters = $analyzer->analyze(CreateUserRequest::class);
// Analysis including conditional rules
$result = $analyzer->analyzeWithConditionalRules(UserRequest::class);
// $result = [
// 'parameters' => [...],
// 'conditional_rules' => [...],
// ]
ResourceAnalyzer
Analyzes API resource class structures.
namespace LaravelSpectrum\Analyzers;
class ResourceAnalyzer
{
/**
* Analyze resource class
*
* @param string $resourceClass
* @return array
*/
public function analyze(string $resourceClass): array;
/**
* Analyze including nested resources
*
* @param string $resourceClass
* @param int $depth
* @return array
*/
public function analyzeWithNested(string $resourceClass, int $depth = 3): array;
}
Usage Examples:
$analyzer = app(ResourceAnalyzer::class);
// Get resource structure
$structure = $analyzer->analyze(UserResource::class);
// Analyze including nested resources (up to depth 5)
$structure = $analyzer->analyzeWithNested(PostResource::class, 5);
QueryParameterAnalyzer
Detects query parameters from controller methods.
namespace LaravelSpectrum\Analyzers;
class QueryParameterAnalyzer
{
/**
* Detect query parameters from method
*
* @param string $controller
* @param string $method
* @return array
*/
public function analyze(string $controller, string $method): array;
}
🏗️ Generators
OpenApiGenerator
Main generator for creating OpenAPI specifications.
namespace LaravelSpectrum\Generators;
class OpenApiGenerator
{
/**
* Generate OpenAPI document
*
* @param array $routes
* @param array $options
* @return array
*/
public function generate(array $routes, array $options = []): array;
/**
* Generate path item
*
* @param array $route
* @return array
*/
public function generatePathItem(array $route): array;
/**
* Generate operation
*
* @param array $route
* @return array
*/
public function generateOperation(array $route): array;
}
Options:
$options = [
'title' => 'My API',
'version' => '2.0.0',
'description' => 'API Description',
'servers' => [
['url' => 'https://api.example.com'],
],
'includeVendor' => false,
'generateExamples' => true,
];
$openapi = $generator->generate($routes, $options);
SchemaGenerator
Generates JSON schemas from data structures.
namespace LaravelSpectrum\Generators;
class SchemaGenerator
{
/**
* Generate schema from validation rules
*
* @param array $rules
* @return array
*/
public function fromValidationRules(array $rules): array;
/**
* Generate schema from resource structure
*
* @param array $structure
* @return array
*/
public function fromResourceStructure(array $structure): array;
/**
* Generate schema from model
*
* @param string $modelClass
* @return array
*/
public function fromModel(string $modelClass): array;
}
ExampleGenerator
Generates realistic example data.
namespace LaravelSpectrum\Generators;
class ExampleGenerator
{
/**
* Generate example from schema
*
* @param array $schema
* @param string|null $fieldName
* @return mixed
*/
public function generateFromSchema(array $schema, ?string $fieldName = null);
/**
* Generate example from validation rules
*
* @param array $rules
* @param string $fieldName
* @return mixed
*/
public function generateFromRules(array $rules, string $fieldName);
}
🔌 Events
Available Events
// Before route analysis
LaravelSpectrum\Events\BeforeRouteAnalysis::class
// After route analysis
LaravelSpectrum\Events\AfterRouteAnalysis::class
// Before document generation
LaravelSpectrum\Events\BeforeDocumentGeneration::class
// After document generation
LaravelSpectrum\Events\AfterDocumentGeneration::class
// On error
LaravelSpectrum\Events\AnalysisError::class
Registering Event Listeners
// EventServiceProvider.php
protected $listen = [
\LaravelSpectrum\Events\AfterRouteAnalysis::class => [
\App\Listeners\LogRouteAnalysis::class,
],
\LaravelSpectrum\Events\AfterDocumentGeneration::class => [
\App\Listeners\NotifyDocumentGenerated::class,
\App\Listeners\UploadToS3::class,
],
];
Custom Listener Example
namespace App\Listeners;
use LaravelSpectrum\Events\AfterDocumentGeneration;
class NotifyDocumentGenerated
{
public function handle(AfterDocumentGeneration $event)
{
$openapi = $event->getOpenApi();
$stats = $event->getStatistics();
// Notify Slack
Slack::send("API documentation generated: {$stats['total_routes']} routes");
// Record metrics
Metrics::record('api_docs_generated', [
'routes' => $stats['total_routes'],
'duration' => $stats['duration'],
]);
}
}
🎨 Contracts
Analyzer Contract
namespace LaravelSpectrum\Contracts;
interface Analyzer
{
/**
* Execute analysis
*
* @param mixed $target
* @return array
*/
public function analyze($target): array;
/**
* Check if target is supported
*
* @param mixed $target
* @return bool
*/
public function supports($target): bool;
}
Generator Contract
namespace LaravelSpectrum\Contracts;
interface Generator
{
/**
* Execute generation
*
* @param array $data
* @param array $options
* @return array
*/
public function generate(array $data, array $options = []): array;
}
ExportFormatter Contract
namespace LaravelSpectrum\Contracts;
interface ExportFormatter
{
/**
* Format OpenAPI document
*
* @param array $openapi
* @return array
*/
public function format(array $openapi): array;
/**
* Get supported format
*
* @return string
*/
public function getFormat(): string;
}
🛠️ Services
DocumentationCache
Manages documentation generation caching.
use LaravelSpectrum\Cache\DocumentationCache;
$cache = app(DocumentationCache::class);
// Get from cache or generate
$data = $cache->remember('routes:all', function () {
return $this->analyzeAllRoutes();
});
// Clear specific cache
$cache->forget('routes:api/users');
// Clear by pattern
$cache->forgetByPattern('routes:api/*');
// Clear all
$cache->clear();
FileWatcher
Monitors file changes.
use LaravelSpectrum\Services\FileWatcher;
$watcher = app(FileWatcher::class);
// Start watching
$watcher->watch([
app_path('Http/Controllers'),
app_path('Http/Requests'),
], function ($path, $changeType) {
// Handle file changes
echo "File {$changeType}: {$path}\n";
});
// Stop watching
$watcher->stop();
💡 Extension Points
Adding Custom Analyzers
use LaravelSpectrum\Facades\Spectrum;
// AppServiceProvider.php
public function boot()
{
Spectrum::addAnalyzer('custom', CustomAnalyzer::class);
}
// Usage
$result = Spectrum::analyze('custom', $target);
Adding Custom Generators
Spectrum::addGenerator('graphql', GraphQLGenerator::class);
// Usage
$schema = Spectrum::generate('graphql', $data);
Adding Middleware
Spectrum::addMiddleware(function ($openapi, $next) {
// Pre-processing
$openapi['x-custom'] = 'value';
$openapi = $next($openapi);
// Post-processing
return $openapi;
});
🔍 Helper Functions
// Generate OpenAPI document
$openapi = spectrum_generate();
// Generate with specific route patterns
$openapi = spectrum_generate(['api/v1/*']);
// Analyze routes
$routes = spectrum_analyze_routes();
// Analyze FormRequest
$params = spectrum_analyze_request(CreateUserRequest::class);
// Analyze resource
$schema = spectrum_analyze_resource(UserResource::class);
📊 Debugging and Logging
Debug Mode
// config/spectrum.php
'debug' => [
'enabled' => true,
'log_level' => 'debug',
'log_channel' => 'spectrum',
],
Custom Logger
use LaravelSpectrum\Facades\Spectrum;
Spectrum::setLogger(function ($level, $message, $context) {
// Custom logging logic
CustomLogger::log($level, $message, $context);
});
Performance Monitoring
use LaravelSpectrum\Support\PerformanceMonitor;
$monitor = app(PerformanceMonitor::class);
$monitor->start('route_analysis');
// Processing...
$monitor->end('route_analysis');
// Get statistics
$stats = $monitor->getStatistics();
// [
// 'route_analysis' => [
// 'duration' => 1.234,
// 'memory' => 2048,
// 'count' => 150,
// ]
// ]
📚 Related Documentation
- Customization - Detailed extension methods
- Plugin Development - Creating plugins
- Contributing Guide - Contributing to the project