Install the package via Composer:
composer require tweekersnut/event-dispatcher
The service provider will be automatically registered via Laravel's package discovery.
- Install the package via Composer:
composer require tweekersnut/event-dispatcher
- Include the Composer autoloader in your project:
require_once __DIR__ . '/vendor/autoload.php';
Clone the repository and install dependencies:
git clone https://github.com/TaranpreetSinghRayat/event-dispatcher.git
cd event-dispatcher
composer install
Run the examples:
php examples/core-php/basic-usage.php
Or use the interactive example runner:
php run-examples.php
use EventDispatcher\EventDispatcher;
use EventDispatcher\Event;
// Create dispatcher instance
$dispatcher = new EventDispatcher();
// Listen to an event
$dispatcher->listen('user.created', function ($event) {
echo "User created: " . $event->getData('name');
});
// Dispatch an event
$event = new Event('user.created', ['name' => 'John Doe']);
$dispatcher->dispatch($event);
The service provider is automatically registered via Laravel's package discovery.
use EventDispatcher\Laravel\Facades\EventDispatcher;
use EventDispatcher\Event;
// Listen to an event
EventDispatcher::listen('user.created', function ($event) {
Log::info('User created: ' . $event->getData('name'));
});
// Dispatch an event
$event = new Event('user.created', ['name' => 'John Doe']);
EventDispatcher::dispatch($event);
For Laravel:
composer require tweekersnut/event-dispatcher
For Core PHP:
composer require tweekersnut/event-dispatcher
After installation, you can run the included examples to see the package in action:
# Run basic usage example
php vendor/tweekersnut/event-dispatcher/examples/core-php/basic-usage.php
# Or if you cloned the repository
php examples/core-php/basic-usage.php
Core PHP:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use EventDispatcher\EventDispatcher;
use EventDispatcher\Event;
$dispatcher = new EventDispatcher();
// Your event handling code here
Laravel:
<?php
use EventDispatcher\Laravel\Facades\EventDispatcher;
// Use the facade anywhere in your Laravel app
EventDispatcher::listen('event.name', function($event) {
// Handle event
});
use EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
// Register a listener
$dispatcher->listen('order.placed', function ($event) {
// Handle the event
echo "Order placed: " . $event->getData('order_id');
});
// Dispatch the event
$dispatcher->dispatch('order.placed', ['order_id' => 123]);
use EventDispatcher\Event;
// Create an event with data
$event = new Event('user.registered', [
'name' => 'Jane Doe',
'email' => 'jane@example.com'
]);
// Dispatch the event
$dispatcher->dispatch($event);
use EventDispatcher\Event;
class UserRegisteredEvent extends Event
{
private $user;
public function __construct(array $user)
{
parent::__construct('user.registered');
$this->user = $user;
}
public function getUser(): array
{
return $this->user;
}
}
// Dispatch custom event
$dispatcher->dispatch(new UserRegisteredEvent([
'name' => 'John',
'email' => 'john@example.com'
]));
$dispatcher->listen('user.created', function ($event) {
// Handle event
});
use EventDispatcher\Contracts\ListenerInterface;
class SendWelcomeEmail implements ListenerInterface
{
public function handle($event): void
{
$user = $event->getData('user');
// Send email logic
}
}
// Register the listener
$dispatcher->listen('user.created', SendWelcomeEmail::class);
// or
$dispatcher->listen('user.created', new SendWelcomeEmail());
Listeners with higher priority execute first:
$dispatcher->listen('order.placed', function ($event) {
echo "3. Send confirmation";
}, 0);
$dispatcher->listen('order.placed', function ($event) {
echo "1. Validate order";
}, 100);
$dispatcher->listen('order.placed', function ($event) {
echo "2. Process payment";
}, 50);
Group related event listeners together:
use EventDispatcher\Subscriber;
class UserEventSubscriber extends Subscriber
{
public function getSubscribedEvents(): array
{
return [
'user.created' => 'onUserCreated',
'user.updated' => ['method' => 'onUserUpdated', 'priority' => 10],
'user.deleted' => [
['method' => 'onUserDeleted', 'priority' => 5],
'logUserDeletion'
]
];
}
public function onUserCreated($event): void
{
// Handle user created
}
public function onUserUpdated($event): void
{
// Handle user updated
}
public function onUserDeleted($event): void
{
// Handle user deleted
}
public function logUserDeletion($event): void
{
// Log deletion
}
}
// Register the subscriber
$dispatcher->subscribe(new UserEventSubscriber());
$dispatcher->listen('user.login', function ($event) {
if ($event->getData('user')->isBanned()) {
return false; // Stop propagation
}
}, 100);
$dispatcher->listen('user.login', function ($event) {
// This won't execute if user is banned
}, 50);
// Check if event has listeners
if ($dispatcher->hasListeners('user.created')) {
// Event has listeners
}
// Get all listeners for an event
$listeners = $dispatcher->getListeners('user.created');
// Remove all listeners for an event
$dispatcher->forget('user.created');
// Remove specific listener
$listener = function ($event) { /* ... */ };
$dispatcher->listen('user.created', $listener);
$dispatcher->forget('user.created', $listener);
// Get all registered events
$events = $dispatcher->getEvents();
// Clear all listeners
$dispatcher->clear();
php artisan vendor:publish --tag=event-dispatcher-config
use EventDispatcher\Contracts\DispatcherInterface;
class UserController extends Controller
{
protected $dispatcher;
public function __construct(DispatcherInterface $dispatcher)
{
$this->dispatcher = $dispatcher;
}
public function store(Request $request)
{
$user = User::create($request->all());
$this->dispatcher->dispatch('user.created', $user);
return response()->json($user);
}
}
In config/event-dispatcher.php:
return [
'subscribers' => [
\App\Subscribers\UserEventSubscriber::class,
\App\Subscribers\OrderEventSubscriber::class,
],
];
Run the interactive example runner:
php run-examples.php
Or run individual examples directly:
php examples/core-php/basic-usage.php
php examples/core-php/listener-classes.php
php examples/core-php/subscriber-example.php
Check the examples directory for more detailed examples:
-
Core PHP Examples:
examples/core-php/basic-usage.php- Basic event dispatchingexamples/core-php/listener-classes.php- Using listener classesexamples/core-php/subscriber-example.php- Event subscribers
-
Laravel Examples:
examples/laravel/README.md- Comprehensive Laravel integration guide
use EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
$eventDispatched = false;
$dispatcher->listen('test.event', function () use (&$eventDispatched) {
$eventDispatched = true;
});
$dispatcher->dispatch('test.event');
assert($eventDispatched === true);
listen(string $eventName, $listener, int $priority = 0): void- Register an event listenersubscribe($subscriber): void- Register an event subscriberdispatch($event, $payload = null)- Dispatch an eventforget(string $eventName, $listener = null): void- Remove listenershasListeners(string $eventName): bool- Check if event has listenersgetListeners(string $eventName): array- Get all listeners for an eventgetEvents(): array- Get all registered eventsclear(): void- Clear all listeners
- PHP 7.4 or higher
- Laravel 8.x, 9.x, 10.x, or 11.x (for Laravel integration)