PHP code example of jayanta / laravel-api-versionist
1. Go to this page and download the library: Download jayanta/laravel-api-versionist library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
jayanta / laravel-api-versionist example snippets
// Your controller. Always latest version. That's it.
class UserController extends Controller
{
public function show(User $user)
{
return response()->json([
'handle' => $user->handle,
'roles' => $user->roles,
]);
}
}
// app/Api/Transformers/V2Transformer.php
final class V2Transformer extends ApiVersionTransformer
{
public function version(): string { return 'v2'; }
public function description(): string
{
return 'Renamed username to handle, converted role string to roles array.';
}
public function upgradeRequest(array $data): array
{
if (isset($data['username'])) {
$data['handle'] = $data['username'];
unset($data['username']);
}
if (isset($data['role']) && is_string($data['role'])) {
$data['roles'] = [$data['role']];
unset($data['role']);
}
return $data;
}
public function downgradeResponse(array $data): array
{
if (isset($data['handle'])) {
$data['username'] = $data['handle'];
unset($data['handle']);
}
if (isset($data['roles']) && is_array($data['roles'])) {
$data['role'] = $data['roles'][0] ?? 'user';
unset($data['roles']);
}
return $data;
}
}
// routes/api.php
Route::middleware('api.version')->group(function () {
Route::get('/users/{user}', [UserController::class, 'show']);
});
// or use the shorthand macro
Route::versioned()->group(function () { /* ... */ });
final class V2Transformer extends ApiVersionTransformer
{
public function version(): string { return 'v2'; }
public function description(): string { return 'Renamed username to handle, role string to roles array.'; }
public function releasedAt(): ?string { return '2025-03-01'; }
public function upgradeRequest(array $data): array
{
if (isset($data['username'])) {
$data['handle'] = $data['username'];
unset($data['username']);
}
if (isset($data['role']) && is_string($data['role'])) {
$data['roles'] = [$data['role']];
unset($data['role']);
}
return $data;
}
public function downgradeResponse(array $data): array
{
if (isset($data['handle'])) {
$data['username'] = $data['handle'];
unset($data['handle']);
}
if (isset($data['roles']) && is_array($data['roles'])) {
$data['role'] = $data['roles'][0] ?? 'user';
unset($data['roles']);
}
return $data;
}
}
use Versionist\ApiVersionist\Attributes\ApiVersion;
#[ApiVersion('v2', description: 'Renamed username to handle.', releasedAt: '2025-03-01')]
final class V2Transformer extends ApiVersionTransformer
{
public function upgradeRequest(array $data): array { /* ... */ }
public function downgradeResponse(array $data): array { /* ... */ }
}
final class V3Transformer extends ApiVersionTransformer
{
public function __construct(
private readonly UserRepository $repo
) {}
public function version(): string { return 'v3'; }
public function description(): string { return 'Added legacy_role lookup for v2 clients.'; }
public function downgradeResponse(array $data): array
{
if (isset($data['user_id'])) {
$data['legacy_role'] = $this->repo->getLegacyRole($data['user_id']);
}
return $data;
}
}
if ($request->isApiVersionAtLeast('v3')) {
// new pricing logic, auth behavior, business rules
}