Troubleshooting

Common issues and fixes for WPZylos Events.

Listener Not Called

Symptom: Your listener never receives the event.

Causes & Fixes:

  1. Event class mismatch
    // Wrong - different class
    $provider->addListener(\App\Events\UserCreated::class, $handler);
    $dispatcher->dispatch(new \Other\UserCreated());  // Won't match!
    
    // Correct - same class
    $dispatcher->dispatch(new \App\Events\UserCreated());
    
  2. Listener registered after dispatch
    // Wrong order
    $dispatcher->dispatch($event);
    $provider->addListener(Event::class, $handler);  // Too late!
    
    // Correct order
    $provider->addListener(Event::class, $handler);
    $dispatcher->dispatch($event);
    
  3. Earlier listener stopped propagation
    // Check if event implements StoppableEventInterface
    $provider->addListener(Event::class, function ($e) {
        $e->stopPropagation();  // Stops subsequent listeners
    }, 1);
    

Subscriber Methods Not Called

Symptom: Subscriber registered but methods not invoked.

Fixes:

  1. Wrong method name
    public static function getSubscribedEvents(): array
    {
        return [
            UserCreated::class => 'onUserCreated',  // Must match exactly
        ];
    }
    
    public function onUserCreated($event) {}  // Method name must match
    
  2. Subscriber not added
    // Don't forget to register it!
    $eventProvider->subscribe(new MySubscriber());
    

Memory Issues

Symptom: High memory usage with many events.

Fix: Clear listeners when done:

// In a long-running process
foreach ($items as $item) {
    $dispatcher->dispatch(new ItemProcessed($item));
}

// Clear to free memory
$provider->clearListeners(ItemProcessed::class);

Circular Event Dispatch

Symptom: Maximum function nesting or infinite loop.

Fix: Avoid dispatching the same event from its listener:

// Bad: Bad - causes infinite loop
$provider->addListener(UserUpdated::class, function ($event) use ($dispatcher) {
    $dispatcher->dispatch(new UserUpdated($event->user));  // Infinite!
});

// Good: Good - use a different event
$provider->addListener(UserUpdated::class, function ($event) use ($dispatcher) {
    $dispatcher->dispatch(new UserProfileSynced($event->user));
});

Type Errors

Symptom: Type errors when dispatching events.

Fix: Ensure event class matches listener type hint:

// Listener expects UserCreated
$provider->addListener(UserCreated::class, function (UserCreated $event) {
    // ...
});

// Bad: Wrong - string instead of object
$dispatcher->dispatch('UserCreated');

// Good: Correct - event object
$dispatcher->dispatch(new UserCreated($user));

Debug Mode

Enable debug logging:

class DebugEventDispatcher extends EventDispatcher
{
    public function dispatch(object $event): object
    {
        error_log('Dispatching: ' . get_class($event));
        $result = parent::dispatch($event);
        error_log('Dispatched: ' . get_class($event));
        return $result;
    }
}