-
-
Notifications
You must be signed in to change notification settings - Fork 4
Events
Jean-Marc Strauven edited this page Dec 23, 2025
·
1 revision
Learn about the events dispatched by Laravel ApiRoute and how to listen to them.
Laravel ApiRoute dispatches events at key points in the API lifecycle:
| Event | When Dispatched |
|---|---|
DeprecatedVersionAccessed |
When a deprecated version is accessed |
VersionDeprecated |
When a version is marked as deprecated |
VersionSunset |
When a version is marked as sunset |
VersionCreated |
When a new version is created |
Dispatched every time a deprecated version is accessed.
<?php
namespace Grazulex\ApiRoute\Events;
use Grazulex\ApiRoute\VersionDefinition;
use Illuminate\Http\Request;
final readonly class DeprecatedVersionAccessed
{
public function __construct(
public VersionDefinition $version,
public Request $request
) {}
}| Property | Type | Description |
|---|---|---|
$version |
VersionDefinition |
The deprecated version |
$request |
Request |
The incoming HTTP request |
- Log deprecated version usage
- Track which clients still use deprecated versions
- Alert developers about high deprecated usage
<?php
namespace App\Listeners;
use Grazulex\ApiRoute\Events\DeprecatedVersionAccessed;
use Illuminate\Support\Facades\Log;
class LogDeprecatedVersionUsage
{
public function handle(DeprecatedVersionAccessed $event): void
{
Log::warning('Deprecated API version accessed', [
'version' => $event->version->name(),
'endpoint' => $event->request->path(),
'method' => $event->request->method(),
'ip' => $event->request->ip(),
'user_agent' => $event->request->userAgent(),
'user_id' => $event->request->user()?->id,
]);
}
}Dispatched when a version is programmatically marked as deprecated.
<?php
namespace Grazulex\ApiRoute\Events;
use Grazulex\ApiRoute\VersionDefinition;
final readonly class VersionDeprecated
{
public function __construct(
public VersionDefinition $version
) {}
}- Send notifications to API consumers
- Update documentation
- Log for audit trail
<?php
namespace App\Listeners;
use Grazulex\ApiRoute\Events\VersionDeprecated;
use App\Notifications\ApiVersionDeprecated;
use App\Models\ApiConsumer;
class NotifyApiConsumers
{
public function handle(VersionDeprecated $event): void
{
$consumers = ApiConsumer::where('api_version', $event->version->name())->get();
foreach ($consumers as $consumer) {
$consumer->notify(new ApiVersionDeprecated(
$event->version->name(),
$event->version->deprecationDate(),
$event->version->sunsetDate(),
$event->version->successor()
));
}
}
}Dispatched when a version is marked as sunset (end-of-life).
<?php
namespace Grazulex\ApiRoute\Events;
use Grazulex\ApiRoute\VersionDefinition;
final readonly class VersionSunset
{
public function __construct(
public VersionDefinition $version
) {}
}- Archive version resources
- Send final notifications
- Update documentation
<?php
namespace App\Listeners;
use Grazulex\ApiRoute\Events\VersionSunset;
use Illuminate\Support\Facades\Storage;
class ArchiveVersionResources
{
public function handle(VersionSunset $event): void
{
$version = $event->version->name();
// Archive controllers
$sourcePath = app_path("Http/Controllers/Api/{$version}");
$archivePath = storage_path("archived/api/{$version}");
if (is_dir($sourcePath)) {
// Move to archive
rename($sourcePath, $archivePath);
}
// Log the archival
Log::info("API version {$version} has been archived", [
'sunset_date' => $event->version->sunsetDate(),
]);
}
}Dispatched when a new version is created via Artisan command.
<?php
namespace Grazulex\ApiRoute\Events;
use Grazulex\ApiRoute\VersionDefinition;
final readonly class VersionCreated
{
public function __construct(
public VersionDefinition $version
) {}
}- Set up monitoring for new version
- Initialize documentation
- Send team notifications
<?php
namespace App\Providers;
use Grazulex\ApiRoute\Events\DeprecatedVersionAccessed;
use Grazulex\ApiRoute\Events\VersionDeprecated;
use Grazulex\ApiRoute\Events\VersionSunset;
use Grazulex\ApiRoute\Events\VersionCreated;
use App\Listeners\LogDeprecatedVersionUsage;
use App\Listeners\NotifyApiConsumers;
use App\Listeners\ArchiveVersionResources;
use App\Listeners\SetupNewVersion;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
DeprecatedVersionAccessed::class => [
LogDeprecatedVersionUsage::class,
],
VersionDeprecated::class => [
NotifyApiConsumers::class,
],
VersionSunset::class => [
ArchiveVersionResources::class,
],
VersionCreated::class => [
SetupNewVersion::class,
],
];
}use Illuminate\Support\Facades\Event;
use Grazulex\ApiRoute\Events\DeprecatedVersionAccessed;
Event::listen(DeprecatedVersionAccessed::class, function ($event) {
Log::warning("Deprecated version {$event->version->name()} accessed");
});For performance, queue non-critical event handling:
<?php
namespace App\Listeners;
use Grazulex\ApiRoute\Events\DeprecatedVersionAccessed;
use Illuminate\Contracts\Queue\ShouldQueue;
class LogDeprecatedVersionUsage implements ShouldQueue
{
public $queue = 'api-analytics';
public function handle(DeprecatedVersionAccessed $event): void
{
// Heavy processing happens in queue
}
}Dispatch your own events based on version checks:
use Grazulex\ApiRoute\Facades\ApiRoute;
class ApiMiddleware
{
public function handle(Request $request, Closure $next)
{
$version = $request->apiVersion();
$definition = $request->apiVersionDefinition();
// Custom event for beta usage
if ($definition->isBeta()) {
event(new BetaVersionAccessed($definition, $request));
}
// Custom event for specific client
if ($request->header('X-Client-Id') === 'legacy-app') {
event(new LegacyClientRequest($version, $request));
}
return $next($request);
}
}<?php
namespace App\Notifications;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\SlackMessage;
class HighDeprecatedUsageAlert extends Notification
{
public function __construct(
private string $version,
private float $percentage
) {}
public function via($notifiable): array
{
return ['slack'];
}
public function toSlack($notifiable): SlackMessage
{
return (new SlackMessage)
->warning()
->content("High deprecated API usage detected!")
->attachment(function ($attachment) {
$attachment
->title("API Version: {$this->version}")
->fields([
'Usage' => "{$this->percentage}% of total traffic",
'Action Required' => 'Review migration timeline',
]);
});
}
}use Grazulex\ApiRoute\Events\DeprecatedVersionAccessed;
use Illuminate\Support\Facades\Event;
test('deprecated version access dispatches event', function () {
Event::fake([DeprecatedVersionAccessed::class]);
$response = $this->get('/api/v1/users');
Event::assertDispatched(DeprecatedVersionAccessed::class, function ($event) {
return $event->version->name() === 'v1';
});
});use App\Listeners\LogDeprecatedVersionUsage;
use Grazulex\ApiRoute\Events\DeprecatedVersionAccessed;
test('deprecated access is logged', function () {
$listener = new LogDeprecatedVersionUsage();
$event = new DeprecatedVersionAccessed(
$this->createDeprecatedVersion(),
Request::create('/api/v1/users')
);
Log::shouldReceive('warning')
->once()
->withArgs(function ($message, $context) {
return str_contains($message, 'Deprecated');
});
$listener->handle($event);
});- Exceptions - Error handling
- Usage Tracking - Track version usage
- Middleware - How events are dispatched
Laravel ApiRoute - Complete API versioning lifecycle management for Laravel
Home | Getting Started | Examples | Configuration
Made with ❤️ for the Laravel community