Installation Add the bundle via Composer in your Laravel project (assuming compatibility with Laravel's ecosystem):
composer require masando/edemy-eventbundle
Publish the bundle's configuration (if applicable):
php artisan vendor:publish --provider="Masando\eDemyEventBundle\eDemyEventBundleServiceProvider"
First Use Case Trigger and listen to a basic event:
// Dispatch an event
use Masando\eDemyEventBundle\Events\Event;
event(new Event('user.created', ['user_id' => 1]));
// Listen to the event (register in EventServiceProvider)
protected $listen = [
Event::class => [
'App\Listeners\HandleUserCreated',
],
];
Key Files to Review
config/edemy_eventbundle.php (if published)app/Providers/EventServiceProvider.php (for listener binding)src/Events/ (custom event classes)event(new \Masando\eDemyEventBundle\Events\CustomEvent($data));
event(new \Masando\eDemyEventBundle\Events\AsyncEvent($data))->delay(now()->addSeconds(10));
public function store(Request $request) {
$user = User::create($request->all());
event(new \Masando\eDemyEventBundle\Events\UserCreated($user));
}
EventServiceProvider):
protected $listen = [
\Masando\eDemyEventBundle\Events\UserCreated::class => [
'App\Listeners\SendWelcomeEmail',
'App\Listeners\LogUserActivity',
],
];
event(new \Masando\eDemyEventBundle\Events\OrderPlaced($order))
->listen(function ($event) {
// Inline logic
});
event(new \Masando\eDemyEventBundle\Events\PaymentProcessed([
'amount' => 100,
'currency' => 'USD',
'status' => 'completed',
]));
class User {
protected $dispatchesEvents = [
'created' => UserCreated::class,
'deleted' => UserDeleted::class,
];
}
// In EventServiceProvider
$this->app->bind(
\Masando\eDemyEventBundle\Contracts\EventDispatcher::class,
\Masando\eDemyEventBundle\QueueEventDispatcher::class
);
$this->app->singleton(\Masando\eDemyEventBundle\Contracts\EventLogger::class, function ($app) {
return new \App\Services\CustomEventLogger();
});
event(new \Masando\eDemyEventBundle\Events\OrderReceived($order))
->then(function ($event) {
// Post-processing
});
event(new \Masando\eDemyEventBundle\Events\NotificationSent($notification))
->filter(function ($event) {
return $event->notification->isCritical();
});
Extend the base event class:
namespace App\Events;
use Masando\eDemyEventBundle\Events\Event;
class ProductUpdated extends Event {
public $product;
public $changes;
public function __construct($product, array $changes) {
parent::__construct('product.updated');
$this->product = $product;
$this->changes = $changes;
}
}
Event Naming Collisions
'user.created') are unique across the application.'app.user.created'.Listener Performance
event(new \Masando\eDemyEventBundle\Events\HeavyEvent($data))
->listen(function ($event) {
dispatch(new ProcessHeavyEventJob($event->data));
});
Missing Event Classes
composer dump-autoload and namespace imports.Configuration Overrides
php artisan vendor:publish --tag=edemy-eventbundle-config.Async Event Delays
php artisan queue:work
Event Dispatch Logs
Enable Laravel’s event logging in config/logging.php:
'channels' => [
'events' => [
'driver' => 'single',
'path' => storage_path('logs/laravel-events.log'),
'level' => 'debug',
],
],
Then dispatch events with:
event(new \Masando\eDemyEventBundle\Events\DebugEvent($data), ['log' => true]);
Listener Debugging Add temporary logging in listeners:
public function handle(Event $event) {
\Log::debug('Event handled', ['event' => $event->name, 'data' => $event->data]);
// ...
}
Event Payload Inspection Dump event data in listeners:
public function handle(Event $event) {
dd($event->data); // Debug payload
}
Custom Event Dispatcher
Bind a custom dispatcher in EventServiceProvider:
$this->app->singleton(\Masando\eDemyEventBundle\Contracts\EventDispatcher::class, function ($app) {
return new \App\Services\CustomEventDispatcher();
});
Event Middleware Add middleware to events (if supported):
event(new \Masando\eDemyEventBundle\Events\ProtectedEvent($data))
->middleware(\App\Middleware\Authenticate::class);
Event Subscribers Use subscribers for grouped listeners:
namespace App\Listeners;
use Masando\eDemyEventBundle\Events\Event;
use Illuminate\Events\Dispatcher;
class UserEventSubscriber {
public function subscribe(Dispatcher $events) {
$events->listen('user.*', 'App\Listeners\HandleUserEvents');
}
}
Register in EventServiceProvider:
protected $subscribe = [
\App\Listeners\UserEventSubscriber::class,
];
Event Decorators Decorate the event dispatcher for additional logic:
$this->app->decorate(
\Masando\eDemyEventBundle\Contracts\EventDispatcher::class,
\App\Services\EventDecorator::class
);
Queue Connection
Configure the default queue connection in config/queue.php:
'connections' => [
'edemy' => [
'driver' => 'database',
'table' => 'edemy_events',
'queue' => 'edemy',
],
],
Then bind it in EventServiceProvider:
$this->app['queue']->setDefaultConnection('edemy');
Event TTL (Time-to-Live)
If the bundle supports event expiration, configure in config/edemy_eventbundle.php:
'ttl' => [
'default' => 86400, // 24 hours
'critical' => 3600, // 1 hour
],
Event Retries
For queued events, configure retries in config/queue.php:
'failed' => [
'database' => [
'table' => 'failed_edemy_events',
'max_tries' =>
How can I help you explore Laravel packages today?