Add explicit @version special route token support for API major versioning within a single module
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 45/100
Direzione di ricerca
Inizia tracciando la gestione di @version in src/Router/PatternCompiler.php, src/Router/RouteBuilder.php, src/Router/RouteDispatcher.php, src/Router/MatchedRoute.php e src/Http/Traits/Request/Route.php; esamina prima i template di DemoApi e le dipendenze #546 e #548. Il lavoro è completato quando le versioni major configurate e supportate corrispondono, i controller consapevoli della versione vengono risolti all’interno di un modulo, i valori della versione rimangono nel contesto della route e i test coprono il matching e la risoluzione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Add API major versioning support based on the explicit special route token:
@version
so a single API module can expose multiple major API versions concurrently, such as:
/api/v1/posts/api/v2/posts
without treating each version as a separate module.
Why
Quantum needs a clean framework-level API versioning model.
The intended ownership model is:
- one logical
Apimodule - multiple supported API major versions inside that module
With the special route token foundation in place, versioning can be expressed explicitly in route patterns instead of relying on:
- duplicated route trees
- positional URL conventions
- separate modules per version
- hidden dispatch tricks
Goal
Allow routes to explicitly declare API major version position using:
@version
and let the framework treat the matched version as framework-owned route context for version-aware controller resolution.
Proposed Direction
API routes that are versioned should explicitly include:
@version
Examples:
$route->get('@version/posts', 'PostController', 'posts');
$route->get('@version/post/[uuid=:any]', 'PostController', 'post');
$route->post('@version/signin', 'AuthController', 'signin');
This should allow URLs such as:
/api/v1/posts/api/v2/posts/api/v1/signin
depending on module prefix configuration and supported versions.
Config Direction
Supported API versions should be declared in module config.
A likely shape is:
'Api' => [
'prefix' => 'api',
'enabled' => true,
'versions' => ['v1', 'v2'],
]
The route token:
@version
should then match only those configured supported versions.
Controller Resolution Direction
Matched version values should be used by the framework to resolve version-specific controllers inside the same module.
Examples:
-
v1+PostController
resolves to:{ModuleBaseNamespace}\Api\Controllers\V1\PostController
-
v2+PostController
resolves to:{ModuleBaseNamespace}\Api\Controllers\V2\PostController
This allows one route shape to map to different major-version controller implementations inside a single module.
Important behavior
The resolved version should be:
- matched through the
@versiontoken - validated against configured supported versions
- made available to framework internals as version route context
- used for version-aware controller resolution
- kept distinct from ordinary controller action parameters by default
Scope
This ticket should focus on major API versioning only.
It should not introduce:
- minor or patch versioning in the URL
- header-based minor/patch runtime negotiation
- separate modules per API version
Minor and patch changes should remain outside the first implementation scope.
Acceptance Criteria
- routes can explicitly declare API version position using
@version - matched
@versionvalues are validated against configured supported versions - a single API module can expose multiple supported major versions concurrently
- matched version values are used for version-aware controller resolution within the same module
- routed version values do not become ordinary positional controller action parameters by default
- tests cover
@versionroute matching and version-aware controller resolution behavior - templates and examples can be updated to use
@versionwhere appropriate
Notes
Relevant code:
src/Router/PatternCompiler.phpsrc/Router/RouteBuilder.phpsrc/Router/RouteDispatcher.phpsrc/Router/MatchedRoute.phpsrc/Http/Traits/Request/Route.phpsrc/Module/Templates/DemoApi
This ticket depends on:
- Lingua principale
- PHP
- Stelle
- 36
- Fork
- 22
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di quantum-php/framework
-
routing testing
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
quantum-php/framework#547 ·
-
view
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
quantum-php/framework#542 ·
-
enhancement http
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
quantum-php/framework#565 · 1 commento ·
-
components view
Difficoltà 5/5 Più di una settimana Idoneità per principianti 42/100
quantum-php/framework#551 ·
-
lang routing
Difficoltà 5/5 Più di una settimana Idoneità per principianti 45/100
quantum-php/framework#549 ·
Tutte le issue di quantum-php/framework
Issue simili
-
tooling
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
UX
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
ProfessionalWiki/NeoWiki#1525 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
OpenConext/OpenConext-engineblock#2122 ·
-
Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
Automattic/safe-publish#594 ·