メインコンテンツまでスキップ

APIリファレンス

Laravel Spectrumのプログラマティックな使用方法とAPIリファレンスです。

📋 基本的な使用方法

プログラムからの実行

use LaravelSpectrum\Facades\Spectrum;
use LaravelSpectrum\Generators\OpenApiGenerator;
use LaravelSpectrum\Analyzers\RouteAnalyzer;

// ルートを解析
$analyzer = app(RouteAnalyzer::class);
$routes = $analyzer->analyze();

// OpenAPIドキュメントを生成
$generator = app(OpenApiGenerator::class);
$openapi = $generator->generate($routes);

// ファイルに保存
file_put_contents(
storage_path('app/spectrum/openapi.json'),
json_encode($openapi, JSON_PRETTY_PRINT)
);

Facadeの使用

use LaravelSpectrum\Facades\Spectrum;

// ドキュメントを生成
$openapi = Spectrum::generate();

// 特定のルートパターンのみ
$openapi = Spectrum::generate(['api/v1/*']);

// オプション付き
$openapi = Spectrum::generate(['api/*'], [
'includeVendor' => false,
'useCache' => true,
]);

🔍 Analyzers

RouteAnalyzer

ルート情報を解析するメインクラス。

namespace LaravelSpectrum\Analyzers;

class RouteAnalyzer
{
/**
* すべてのルートを解析
*
* @param array $patterns 含めるルートパターン
* @param array $excludes 除外するルートパターン
* @return array
*/
public function analyze(array $patterns = [], array $excludes = []): array;

/**
* 単一のルートを解析
*
* @param \Illuminate\Routing\Route $route
* @return array|null
*/
public function analyzeRoute($route): ?array;
}

使用例:

$analyzer = app(RouteAnalyzer::class);

// すべてのAPIルートを解析
$routes = $analyzer->analyze(['api/*']);

// 特定のルートを除外
$routes = $analyzer->analyze(['api/*'], ['api/debug/*']);

// 単一ルートの解析
$route = Route::getRoutes()->getByName('users.index');
$analyzed = $analyzer->analyzeRoute($route);

FormRequestAnalyzer

FormRequestクラスからバリデーションルールを抽出。

namespace LaravelSpectrum\Analyzers;

class FormRequestAnalyzer
{
/**
* FormRequestを解析
*
* @param string $requestClass
* @return array
*/
public function analyze(string $requestClass): array;

/**
* 条件付きルールを含めて解析
*
* @param string $requestClass
* @return array
*/
public function analyzeWithConditionalRules(string $requestClass): array;
}

使用例:

$analyzer = app(FormRequestAnalyzer::class);

// 基本的な解析
$parameters = $analyzer->analyze(CreateUserRequest::class);

// 条件付きルールも含めて解析
$result = $analyzer->analyzeWithConditionalRules(UserRequest::class);
// $result = [
// 'parameters' => [...],
// 'conditional_rules' => [...],
// ]

ResourceAnalyzer

APIリソースクラスの構造を解析。

namespace LaravelSpectrum\Analyzers;

class ResourceAnalyzer
{
/**
* リソースクラスを解析
*
* @param string $resourceClass
* @return array
*/
public function analyze(string $resourceClass): array;

/**
* ネストされたリソースも含めて解析
*
* @param string $resourceClass
* @param int $depth
* @return array
*/
public function analyzeWithNested(string $resourceClass, int $depth = 3): array;
}

使用例:

$analyzer = app(ResourceAnalyzer::class);

// リソースの構造を取得
$structure = $analyzer->analyze(UserResource::class);

// ネストされたリソースも含めて解析(深さ5まで)
$structure = $analyzer->analyzeWithNested(PostResource::class, 5);

QueryParameterAnalyzer

コントローラーメソッドからクエリパラメータを検出。

namespace LaravelSpectrum\Analyzers;

class QueryParameterAnalyzer
{
/**
* メソッドからクエリパラメータを検出
*
* @param string $controller
* @param string $method
* @return array
*/
public function analyze(string $controller, string $method): array;
}

🏗️ Generators

OpenApiGenerator

OpenAPI仕様を生成するメインジェネレーター。

namespace LaravelSpectrum\Generators;

class OpenApiGenerator
{
/**
* OpenAPIドキュメントを生成
*
* @param array $routes
* @param array $options
* @return array
*/
public function generate(array $routes, array $options = []): array;

/**
* パスアイテムを生成
*
* @param array $route
* @return array
*/
public function generatePathItem(array $route): array;

/**
* オペレーションを生成
*
* @param array $route
* @return array
*/
public function generateOperation(array $route): array;
}

オプション:

$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

データ構造からJSONスキーマを生成。

namespace LaravelSpectrum\Generators;

class SchemaGenerator
{
/**
* バリデーションルールからスキーマを生成
*
* @param array $rules
* @return array
*/
public function fromValidationRules(array $rules): array;

/**
* リソース構造からスキーマを生成
*
* @param array $structure
* @return array
*/
public function fromResourceStructure(array $structure): array;

/**
* モデルからスキーマを生成
*
* @param string $modelClass
* @return array
*/
public function fromModel(string $modelClass): array;
}

ExampleGenerator

リアルな例データを生成。

namespace LaravelSpectrum\Generators;

class ExampleGenerator
{
/**
* スキーマから例を生成
*
* @param array $schema
* @param string|null $fieldName
* @return mixed
*/
public function generateFromSchema(array $schema, ?string $fieldName = null);

/**
* バリデーションルールから例を生成
*
* @param array $rules
* @param string $fieldName
* @return mixed
*/
public function generateFromRules(array $rules, string $fieldName);
}

🔌 Events

利用可能なイベント

// ルート解析前
LaravelSpectrum\Events\BeforeRouteAnalysis::class

// ルート解析後
LaravelSpectrum\Events\AfterRouteAnalysis::class

// ドキュメント生成前
LaravelSpectrum\Events\BeforeDocumentGeneration::class

// ドキュメント生成後
LaravelSpectrum\Events\AfterDocumentGeneration::class

// エラー発生時
LaravelSpectrum\Events\AnalysisError::class

イベントリスナーの登録

// EventServiceProvider.php
protected $listen = [
\LaravelSpectrum\Events\AfterRouteAnalysis::class => [
\App\Listeners\LogRouteAnalysis::class,
],
\LaravelSpectrum\Events\AfterDocumentGeneration::class => [
\App\Listeners\NotifyDocumentGenerated::class,
\App\Listeners\UploadToS3::class,
],
];

カスタムリスナーの例

namespace App\Listeners;

use LaravelSpectrum\Events\AfterDocumentGeneration;

class NotifyDocumentGenerated
{
public function handle(AfterDocumentGeneration $event)
{
$openapi = $event->getOpenApi();
$stats = $event->getStatistics();

// Slackに通知
Slack::send("API documentation generated: {$stats['total_routes']} routes");

// メトリクスを記録
Metrics::record('api_docs_generated', [
'routes' => $stats['total_routes'],
'duration' => $stats['duration'],
]);
}
}

🎨 Contracts

Analyzer契約

namespace LaravelSpectrum\Contracts;

interface Analyzer
{
/**
* 解析を実行
*
* @param mixed $target
* @return array
*/
public function analyze($target): array;

/**
* 対象をサポートしているか
*
* @param mixed $target
* @return bool
*/
public function supports($target): bool;
}

Generator契約

namespace LaravelSpectrum\Contracts;

interface Generator
{
/**
* 生成を実行
*
* @param array $data
* @param array $options
* @return array
*/
public function generate(array $data, array $options = []): array;
}

ExportFormatter契約

namespace LaravelSpectrum\Contracts;

interface ExportFormatter
{
/**
* OpenAPIドキュメントをフォーマット
*
* @param array $openapi
* @return array
*/
public function format(array $openapi): array;

/**
* サポートする形式
*
* @return string
*/
public function getFormat(): string;
}

🛠️ Services

DocumentationCache

ドキュメント生成のキャッシュ管理。

use LaravelSpectrum\Cache\DocumentationCache;

$cache = app(DocumentationCache::class);

// キャッシュから取得または生成
$data = $cache->remember('routes:all', function () {
return $this->analyzeAllRoutes();
});

// 特定のキャッシュをクリア
$cache->forget('routes:api/users');

// パターンでクリア
$cache->forgetByPattern('routes:api/*');

// すべてクリア
$cache->clear();

FileWatcher

ファイル変更の監視。

use LaravelSpectrum\Services\FileWatcher;

$watcher = app(FileWatcher::class);

// 監視を開始
$watcher->watch([
app_path('Http/Controllers'),
app_path('Http/Requests'),
], function ($path, $changeType) {
// ファイル変更時の処理
echo "File {$changeType}: {$path}\n";
});

// 監視を停止
$watcher->stop();

💡 拡張ポイント

カスタムアナライザーの追加

use LaravelSpectrum\Facades\Spectrum;

// AppServiceProvider.php
public function boot()
{
Spectrum::addAnalyzer('custom', CustomAnalyzer::class);
}

// 使用
$result = Spectrum::analyze('custom', $target);

カスタムジェネレーターの追加

注意: カスタムジェネレーター機能は将来のリリースで提供予定です。

// 計画中のカスタムジェネレーターAPIの例
Spectrum::addGenerator('custom', CustomSchemaGenerator::class);

// 使用
$schema = Spectrum::generate('custom', $data);

ミドルウェアの追加

Spectrum::addMiddleware(function ($openapi, $next) {
// 前処理
$openapi['x-custom'] = 'value';

$openapi = $next($openapi);

// 後処理
return $openapi;
});

🔍 ヘルパー関数

// OpenAPIドキュメントを生成
$openapi = spectrum_generate();

// 特定のルートパターンで生成
$openapi = spectrum_generate(['api/v1/*']);

// ルートを解析
$routes = spectrum_analyze_routes();

// FormRequestを解析
$params = spectrum_analyze_request(CreateUserRequest::class);

// リソースを解析
$schema = spectrum_analyze_resource(UserResource::class);

📊 デバッグとロギング

デバッグモード

// config/spectrum.php
'debug' => [
'enabled' => true,
'log_level' => 'debug',
'log_channel' => 'spectrum',
],

カスタムロガー

use LaravelSpectrum\Facades\Spectrum;

Spectrum::setLogger(function ($level, $message, $context) {
// カスタムロギング処理
CustomLogger::log($level, $message, $context);
});

パフォーマンス計測

use LaravelSpectrum\Support\PerformanceMonitor;

$monitor = app(PerformanceMonitor::class);
$monitor->start('route_analysis');

// 処理...

$monitor->end('route_analysis');

// 統計を取得
$stats = $monitor->getStatistics();
// [
// 'route_analysis' => [
// 'duration' => 1.234,
// 'memory' => 2048,
// 'count' => 150,
// ]
// ]

📚 関連ドキュメント