Features Overview
Laravel Spectrum provides a detailed explanation of all features.
📝 Request Analysis
FormRequest Validation
Automatically detects validation rules from FormRequest classes and converts them to OpenAPI schemas.
class UpdateUserRequest extends FormRequest
{
public function rules()
{
return [
'name' => 'sometimes|string|max:255',
'email' => 'sometimes|email|unique:users,email,' . $this->user->id,
'age' => 'nullable|integer|min:0|max:150',
'role' => 'required|in:admin,editor,viewer',
'tags' => 'array',
'tags.*' => 'string|distinct',
'profile' => 'required|array',
'profile.bio' => 'nullable|string|max:1000',
'profile.avatar' => 'nullable|file|image|max:2048',
];
}
}
Generated schema:
name
: optional, string, maximum 255 charactersemail
: optional, email formatage
: nullable, integer, range 0-150role
: required, enum ['admin', 'editor', 'viewer']tags
: array, each element is a stringprofile.avatar
: file upload, image format, maximum 2MB
Inline Validation
Also detects validate()
methods within controllers:
public function update(Request $request, $id)
{
$validated = $request->validate([
'status' => 'required|in:draft,published,archived',
'published_at' => 'required_if:status,published|date',
]);
}
Conditional Validation
Dynamic validation based on HTTP methods or other conditions:
public function rules()
{
$rules = [
'title' => 'required|string|max:255',
];
if ($this->isMethod('POST')) {
$rules['slug'] = 'required|unique:posts';
} elseif ($this->isMethod('PUT')) {
$rules['slug'] = 'required|unique:posts,slug,' . $this->route('post');
}
return $rules;
}
📦 Response Analysis
API Resources
Automatically analyzes Laravel API Resource structures:
class PostResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'content' => $this->when($request->user(), $this->content),
'author' => new UserResource($this->whenLoaded('author')),
'tags' => TagResource::collection($this->whenLoaded('tags')),
'meta' => [
'views' => $this->views_count,
'likes' => $this->likes_count,
],
$this->mergeWhen($request->user()?->isAdmin(), [
'admin_notes' => $this->admin_notes,
]),
];
}
}
Detected elements:
- Basic fields (id, title, slug)
- Conditional fields (
when()
,mergeWhen()
) - Nested resources
- Relations (
whenLoaded()
) - Metadata structures
Fractal Transformers
Also supports League/Fractal usage:
class BookTransformer extends TransformerAbstract
{
protected array $availableIncludes = ['author', 'publisher'];
protected array $defaultIncludes = ['genre'];
public function transform(Book $book)
{
return [
'id' => (int) $book->id,
'title' => $book->title,
'isbn' => $book->isbn,
'published_year' => (int) $book->published_year,
];
}
public function includeAuthor(Book $book)
{
return $this->item($book->author, new AuthorTransformer);
}
}
Pagination
Automatically detects pagination responses:
// Controller
public function index()
{
return PostResource::collection(
Post::with('author')->paginate(15)
);
}
Generated schema includes:
data
: array of itemslinks
: pagination linksmeta
: page information (current_page, total, per_page, etc.)
🔍 Query Parameter Detection
Automatically detects from $request->input()
or $request->query()
within controller methods:
public function index(Request $request)
{
$query = Post::query();
// Search
if ($search = $request->input('search')) {
$query->where('title', 'like', "%{$search}%");
}
// Filtering
if ($status = $request->query('status')) {
$query->where('status', $status);
}
// Sorting
$sortBy = $request->input('sort_by', 'created_at');
$sortOrder = $request->input('sort_order', 'desc');
$query->orderBy($sortBy, $sortOrder);
// Pagination
$perPage = $request->input('per_page', 15);
return PostResource::collection($query->paginate($perPage));
}
Detected parameters:
search
: string, optionalstatus
: string, optionalsort_by
: string, default 'created_at'sort_order
: string, default 'desc'per_page
: integer, default 15
📤 File Upload
Automatic detection of file uploads:
public function rules()
{
return [
'document' => 'required|file|mimes:pdf,doc,docx|max:10240',
'images' => 'required|array|max:5',
'images.*' => 'image|mimes:jpeg,png,jpg|max:2048',
];
}
Documented with appropriate multipart/form-data
encoding.
🔐 Authentication and Security
Middleware Detection
Route::middleware(['auth:sanctum', 'verified'])->group(function () {
Route::get('/api/profile', [ProfileController::class, 'show']);
});
Route::middleware('auth:api')->group(function () {
Route::apiResource('posts', PostController::class);
});
Custom Middleware
// config/spectrum.php
'authentication' => [
'middleware_map' => [
'auth:sanctum' => 'bearer',
'auth:api' => 'bearer',
'api-key' => 'apiKey',
],
],
🎨 Example Data Generation
Dynamic Examples with Faker
// config/spectrum.php
'example_generation' => [
'use_faker' => true,
'custom_generators' => [
'email' => fn($faker) => $faker->safeEmail(),
'avatar_url' => fn($faker) => $faker->imageUrl(200, 200, 'people'),
'price' => fn($faker) => $faker->randomFloat(2, 10, 1000),
'status' => fn($faker) => $faker->randomElement(['active', 'pending', 'inactive']),
],
],
Integration with Model Factories
Automatically uses model factories when defined:
class UserFactory extends Factory
{
public function definition()
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'role' => fake()->randomElement(['admin', 'user', 'guest']),
];
}
}
🏷️ Tags and Grouping
Automatic Tag Generation
Automatically generated from controller names or route prefixes:
/api/v1/users/* → "Users"
/api/v1/posts/* → "Posts"
/api/admin/* → "Admin"
Custom Tag Mapping
// config/spectrum.php
'tags' => [
'api/auth/login' => 'Authentication',
'api/auth/register' => 'Authentication',
'api/auth/logout' => 'Authentication',
'api/users/*' => 'User Management',
'api/admin/*' => 'Administration',
],
⚡ Performance Features
Incremental Generation
Re-analyzes only changed files:
php artisan spectrum:generate --incremental
Parallel Processing
Speed up with multi-core processing:
php artisan spectrum:generate:optimized --workers=8
Smart Caching
- Route definition caching
- FormRequest analysis result caching
- API Resource structure caching
- Dependency tracking
🔄 Real-time Features
Hot Reload
php artisan spectrum:watch
- Automatic file change detection
- Browser refresh via WebSocket
- Fast differential updates
- Multiple browser synchronization
Watch Targets
app/Http/Controllers/**
app/Http/Requests/**
app/Http/Resources/**
routes/**
config/spectrum.php
🎭 Mock Server Features
Automatic Mock API Generation
Launch a fully functional mock API server from OpenAPI documentation:
php artisan spectrum:mock
Key Features
- Dynamic Response Generation: Automatically generated based on OpenAPI schema
- Authentication Simulation: Supports Bearer, API Key, Basic auth
- Validation: Automatic request validation
- Scenario-based: Multiple scenarios like success/error
- Delay Simulation: Network delay reproduction
Usage Examples
# Basic launch
php artisan spectrum:mock
# Custom port and response delay
php artisan spectrum:mock --port=3000 --delay=200
# Test with error scenario
curl http://localhost:8081/api/users?_scenario=error
For details, see the Mock Server Guide.
📚 Next Steps
- Performance Optimization - Configuration for large projects
- Export Features - Export to Postman or Insomnia
- Customization - Advanced customization methods