3 Commits

Author SHA1 Message Date
Jean-Marc Strauven
6c24d290f4 Merge pull request #7 from Grazulex/feat/apiroute-v2
feat!: upgrade to laravel-apiroute v2.0
2026-01-02 17:50:00 +01:00
Jean-Marc Strauven
396207d6b0 Merge branch 'main' into feat/apiroute-v2 2026-01-02 17:49:51 +01:00
Jean-Marc Strauven
7a35de80d0 feat!: upgrade to laravel-apiroute v2.0 with config-based versioning
- Update composer.json to require grazulex/laravel-apiroute ^2.0
- Add versions config to config/apiroute.php
- Create routes/api/v1.php with version 1 routes
- Update routes/api.php to remove imperative version declarations
- Update README.md with new v2.x documentation

BREAKING CHANGE: API versions are now declared in config/apiroute.php
instead of routes/api.php
2026-01-02 17:47:38 +01:00
5 changed files with 84 additions and 29 deletions

View File

@@ -230,7 +230,9 @@ laravel-api-kit/
│ ├── sanctum.php # Token auth config │ ├── sanctum.php # Token auth config
│ └── scramble.php # API docs config │ └── scramble.php # API docs config
├── routes/ ├── routes/
── api.php # API routes with versioning ── api.php # API routes entry point
│ └── api/
│ └── v1.php # Version 1 routes
├── tests/ ├── tests/
│ └── Feature/Api/V1/ │ └── Feature/Api/V1/
│ └── AuthTest.php # Authentication tests │ └── AuthTest.php # Authentication tests
@@ -241,7 +243,7 @@ laravel-api-kit/
## API Versioning ## API Versioning
This kit uses [grazulex/laravel-apiroute](https://github.com/Grazulex/laravel-apiroute) for API versioning with support for: This kit uses [grazulex/laravel-apiroute](https://github.com/Grazulex/laravel-apiroute) v2.x for API versioning with support for:
- **URI Path** (default): `/api/v1/users`, `/api/v2/users` - **URI Path** (default): `/api/v1/users`, `/api/v2/users`
- **Header**: `X-API-Version: 2` - **Header**: `X-API-Version: 2`
@@ -252,22 +254,34 @@ This kit uses [grazulex/laravel-apiroute](https://github.com/Grazulex/laravel-ap
1. Create controllers in `app/Http/Controllers/Api/V2/` 1. Create controllers in `app/Http/Controllers/Api/V2/`
2. Create requests in `app/Http/Requests/Api/V2/` 2. Create requests in `app/Http/Requests/Api/V2/`
3. Update `routes/api.php`: 3. Create route file `routes/api/v2.php`:
```php ```php
use Grazulex\ApiRoute\Facades\ApiRoute; <?php
// Version 2 - New current version use App\Http\Controllers\Api\V2\AuthController;
ApiRoute::version('v2', function () { use Illuminate\Support\Facades\Route;
Route::post('register', [V2\AuthController::class, 'register']);
// ... more routes
})->current();
// Version 1 - Mark as deprecated Route::post('register', [AuthController::class, 'register']);
ApiRoute::version('v1', function () { // ... more routes
Route::post('register', [V1\AuthController::class, 'register']); ```
// ... existing routes
})->deprecated('2025-06-01')->sunset('2025-12-01'); 4. Update `config/apiroute.php`:
```php
'versions' => [
'v1' => [
'routes' => base_path('routes/api/v1.php'),
'status' => 'deprecated',
'deprecated_at' => '2025-06-01',
'sunset_at' => '2025-12-01',
'successor' => 'v2',
],
'v2' => [
'routes' => base_path('routes/api/v2.php'),
'status' => 'active',
],
],
``` ```
### Deprecation Headers ### Deprecation Headers
@@ -275,8 +289,8 @@ ApiRoute::version('v1', function () {
When accessing deprecated versions, responses include RFC-compliant headers: When accessing deprecated versions, responses include RFC-compliant headers:
```http ```http
Deprecation: @1717200000 Deprecation: Sun, 01 Jun 2025 00:00:00 GMT
Sunset: Sun, 01 Dec 2025 00:00:00 GMT Sunset: Mon, 01 Dec 2025 00:00:00 GMT
Link: </api/v2>; rel="successor-version" Link: </api/v2>; rel="successor-version"
``` ```
@@ -574,14 +588,11 @@ class PostResource extends JsonResource
4. **Add Routes:** 4. **Add Routes:**
```php ```php
// routes/api.php // routes/api/v1.php
ApiRoute::version('v1', function () { Route::middleware('auth:sanctum')->group(function () {
// ... existing routes // ... existing routes
Route::apiResource('posts', PostController::class);
Route::middleware('auth:sanctum')->group(function () { });
Route::apiResource('posts', PostController::class);
});
})->current();
``` ```
5. **Create Tests:** 5. **Create Tests:**

View File

@@ -8,7 +8,7 @@
"require": { "require": {
"php": "^8.3", "php": "^8.3",
"dedoc/scramble": "^0.12", "dedoc/scramble": "^0.12",
"grazulex/laravel-apiroute": "^1.2", "grazulex/laravel-apiroute": "^2.0",
"laravel/framework": "^12.0", "laravel/framework": "^12.0",
"laravel/sanctum": "^4.0", "laravel/sanctum": "^4.0",
"laravel/tinker": "^2.10.1", "laravel/tinker": "^2.10.1",

View File

@@ -3,6 +3,28 @@
declare(strict_types=1); declare(strict_types=1);
return [ return [
/*
|--------------------------------------------------------------------------
| API Versions
|--------------------------------------------------------------------------
|
| Define your API versions here. Each version has its own route file,
| middleware, and lifecycle status.
|
*/
'versions' => [
'v1' => [
'routes' => base_path('routes/api/v1.php'),
'middleware' => [],
'status' => 'active',
'deprecated_at' => null,
'sunset_at' => null,
'successor' => null,
'documentation' => null,
'rate_limit' => null,
],
],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Detection Strategy | Detection Strategy

View File

@@ -1,15 +1,14 @@
<?php <?php
use App\Http\Controllers\Api\V1\AuthController;
use Grazulex\ApiRoute\Facades\ApiRoute;
use Illuminate\Support\Facades\Route;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| API Routes | API Routes
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| API routes are versioned using grazulex/laravel-apiroute. | API routes are versioned using grazulex/laravel-apiroute v2.x.
| Versions are defined in config/apiroute.php and route files are
| located in routes/api/{version}.php
|
| Supports URI path, header, query, and Accept header detection. | Supports URI path, header, query, and Accept header detection.
| See config/apiroute.php for configuration options. | See config/apiroute.php for configuration options.
| |

23
routes/api/v1.php Normal file
View File

@@ -0,0 +1,23 @@
<?php
use App\Http\Controllers\Api\V1\AuthController;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| API V1 Routes
|--------------------------------------------------------------------------
|
| Routes for API version 1.
|
*/
// Public routes
Route::post('register', [AuthController::class, 'register'])->name('api.v1.register');
Route::post('login', [AuthController::class, 'login'])->name('api.v1.login');
// Protected routes
Route::middleware('auth:sanctum')->group(function () {
Route::post('logout', [AuthController::class, 'logout'])->name('api.v1.logout');
Route::get('me', [AuthController::class, 'me'])->name('api.v1.me');
});