Aeros provides an event system based on the Observer pattern, allowing you to decouple components and trigger actions in response to events throughout your application.
Register event listeners using the addEventListener() method:
// Register a single eventevent()->addEventListener('user.registered', UserRegisteredEvent::class);// Register the same listener for multiple eventsevent()->addEventListener( ['user.registered', 'user.imported'], UserRegisteredEvent::class);
The event listener class must exist and extend Observable, otherwise a TypeError will be thrown.
class UserDeletedEvent extends Observable{ public function update(mixed $eventData): bool { $userId = $eventData['id']; // Clean up user data cache('redis')->del("user:{$userId}"); cache('redis')->del("session:user:{$userId}"); // Remove from search index search()->remove('users', $userId); // Log deletion logger()->log("User {$userId} deleted and cleaned up"); return true; }}
Register and use:
// Register during application bootstrapevent()->addEventListener('user.deleted', UserDeletedEvent::class);// Trigger when deleting a userfunction deleteUser($userId) { // Delete from database db()->query('DELETE FROM users WHERE id = ?', [$userId]); // Trigger cleanup event event()->emit('user.deleted', ['id' => $userId]);}
The event system validates that listeners extend Observable:
try { event()->addEventListener('invalid.event', 'InvalidClass');} catch (\TypeError $e) { // ERROR[event] Event "InvalidClass" were not found or invalid. logger()->log($e->getMessage());}
You need immediate, synchronous reactions to actions within the same request lifecycle.
Use Queues When
You need asynchronous, background processing that shouldn’t block the current request.
Best practice: Use events to trigger queued jobs for heavy operations:
class UserRegisteredEvent extends Observable{ public function update(mixed $eventData): bool { // Quick operations logger()->log("User registered: {$eventData['email']}"); // Heavy operations as jobs queue()->push(new SendWelcomeEmailJob($eventData)); queue()->push(new CreateUserProfileJob($eventData)); queue()->push(new SendToAnalyticsJob($eventData)); return true; }}