Awesome-claude-code create-api-versioning
Generates API Versioning pattern for PHP 8.4. Creates version resolution strategies (URI prefix, Accept header, query parameter), middleware, and deprecation support. Includes unit tests.
install
source · Clone the upstream repo
git clone https://github.com/dykyi-roman/awesome-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/dykyi-roman/awesome-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/create-api-versioning" ~/.claude/skills/dykyi-roman-awesome-claude-code-create-api-versioning && rm -rf "$T"
manifest:
skills/create-api-versioning/SKILL.mdsource content
API Versioning Generator
Creates API Versioning infrastructure with multiple resolution strategies and deprecation support.
When to Use
| Scenario | Example |
|---|---|
| Breaking API changes | New response format |
| Multiple API consumers | Mobile v1, web v2 |
| Gradual migration | Sunset old versions |
| Backward compatibility | Support legacy clients |
Component Characteristics
ApiVersion (Value Object)
- Immutable version representation
- Major and minor version numbers
- Comparison methods (equals, greaterThan, lessThan)
- String parsing (fromString "v1.2")
VersionResolverInterface
- Extracts version from PSR-7 request
- Returns null if version not found
- Strategy pattern for different sources
Resolution Strategies
- UriPrefixVersionResolver — Extracts from URI path (/v1/orders)
- AcceptHeaderVersionResolver — Extracts from Accept header (application/vnd.api.v1+json)
- QueryParamVersionResolver — Extracts from query string (?version=1)
- CompositeVersionResolver — Tries multiple strategies in order
VersionMiddleware
- PSR-15 middleware
- Resolves version via strategy
- Adds version to request attributes
- Returns 400 if version required but missing
Generation Process
Step 1: Generate Domain Components
Path:
src/Domain/Shared/Api/
— Immutable version value objectApiVersion.php
— Version resolution contractVersionResolverInterface.php
Step 2: Generate Presentation Components
Path:
src/Presentation/Middleware/
— URI path strategyUriPrefixVersionResolver.php
— Content negotiation strategyAcceptHeaderVersionResolver.php
— Query parameter strategyQueryParamVersionResolver.php
— Composite strategyCompositeVersionResolver.php
— PSR-15 middlewareVersionMiddleware.php
— Deprecation/Sunset headersDeprecationHeaderMiddleware.php
Step 3: Generate Tests
— Value object testsApiVersionTest.php
— URI parsing testsUriPrefixVersionResolverTest.php
— Header parsing testsAcceptHeaderVersionResolverTest.php
— Middleware behavior testsVersionMiddlewareTest.php
File Placement
| Component | Path |
|---|---|
| ApiVersion | |
| VersionResolverInterface | |
| Resolvers | |
| Middleware | |
| Unit Tests | |
Naming Conventions
| Component | Pattern | Example |
|---|---|---|
| Version VO | | |
| Resolver Interface | | |
| Resolver | | |
| Composite | | |
| Middleware | | |
| Deprecation | | |
| Test | | |
Quick Template Reference
ApiVersion
final readonly class ApiVersion { public function __construct( public int $major, public int $minor = 0 ) { if ($this->major < 1) { throw new \InvalidArgumentException('Major version must be at least 1'); } } public static function fromString(string $version): self; public function toString(): string; public function equals(self $other): bool; public function greaterThan(self $other): bool; }
VersionResolverInterface
interface VersionResolverInterface { public function resolve(ServerRequestInterface $request): ?ApiVersion; }
Usage Example
// Create composite resolver $resolver = new CompositeVersionResolver([ new UriPrefixVersionResolver(), new AcceptHeaderVersionResolver(), new QueryParamVersionResolver(), ]); // Middleware adds version to request attributes $middleware = new VersionMiddleware($resolver, defaultVersion: new ApiVersion(1)); // In action/controller $version = $request->getAttribute('api_version'); if ($version->greaterThan(new ApiVersion(1))) { return $this->respondV2($data); }
Strategy Comparison
| Strategy | URL Example | Pros | Cons |
|---|---|---|---|
| URI Prefix | | Explicit, cacheable | URL changes per version |
| Accept Header | | Clean URLs | Complex client setup |
| Query Param | | Simple to test | Not RESTful, caching issues |
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|---|---|
| Version in Body | Hard to route | Use URI/header/query |
| Unlimited Versions | Maintenance burden | Deprecation policy |
| No Default Version | Breaks existing clients | Configure default |
| Breaking Without Version | Client disruption | Always version breaking changes |
| No Deprecation Notice | Surprise removal | Deprecation/Sunset headers |
| Copy-Paste Controllers | Duplicated code | Version-aware routing |
References
For complete PHP templates and examples, see:
— ApiVersion, resolvers, middleware, deprecation templatesreferences/templates.md
— Framework integration and testsreferences/examples.md