This example shows a subscriber class handling user login and logout events. When events are dispatched, the subscriber methods print messages with the user's name.
<?php
namespace App\Listeners;
class UserEventSubscriber
{
public function onUserLogin($event)
{
echo "User logged in: {$event->user->name}\n";
}
public function onUserLogout($event)
{
echo "User logged out: {$event->user->name}\n";
}
public function subscribe($events)
{
$events->listen('App\Events\UserLoggedIn', [self::class, 'onUserLogin']);
$events->listen('App\Events\UserLoggedOut', [self::class, 'onUserLogout']);
}
}
// Simulate event objects
class User {
public $name;
public function __construct($name) { $this->name = $name; }
}
class UserLoggedIn {
public $user;
public function __construct($user) { $this->user = $user; }
}
class UserLoggedOut {
public $user;
public function __construct($user) { $this->user = $user; }
}
// Simulate event dispatcher
class EventDispatcher {
protected $listeners = [];
public function listen($eventName, $callback) {
$this->listeners[$eventName][] = $callback;
}
public function dispatch($event) {
$eventName = get_class($event);
if (!empty($this->listeners[$eventName])) {
foreach ($this->listeners[$eventName] as $listener) {
call_user_func($listener, $event);
}
}
}
public function subscribe($subscriber) {
$subscriber->subscribe($this);
}
}
// Usage
$dispatcher = new EventDispatcher();
$subscriber = new \App\Listeners\UserEventSubscriber();
$dispatcher->subscribe($subscriber);
$user = new User('Alice');
$dispatcher->dispatch(new UserLoggedIn($user));
$dispatcher->dispatch(new UserLoggedOut($user));