Zend Framework

Zend Framework 3 Tutorial – Chapter 10: Event Manager and Custom Events

Chapter 10: Event Manager and Custom Events in Zend Framework 3

✅ Introduction

The EventManager in Zend Framework 3 allows components to communicate via events and listeners. This makes your application more modular, extensible, and easier to maintain.

✅ Key Concepts

  • Event: A signal that something has happened (e.g., user.login).
  • Listener: A callback function or method that responds to an event.
  • EventManager: The component that triggers events and attaches listeners.

✅ Creating a Custom Event


use Zend\EventManager\EventManager;

$events = new EventManager();

// Attach a listener
$events->attach('user.registered', function($e) {
    $params = $e->getParams();
    echo "New user registered: " . $params['username'];
});

// Trigger event
$events->trigger('user.registered', null, ['username' => 'JohnDoe']);

✅ Using EventManager in a Class


namespace Application\Service;

use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
use Zend\EventManager\EventManagerInterface;

class UserService implements EventManagerAwareInterface {
    protected $events;

    public function setEventManager(EventManagerInterface $events) {
        $this->events = $events;
        $this->events->setIdentifiers([__CLASS__, get_class($this)]);
    }

    public function getEventManager() {
        if (!$this->events) {
            $this->setEventManager(new EventManager());
        }
        return $this->events;
    }

    public function registerUser($username) {
        // Business logic for user registration
        echo "User $username registered successfully.
";

        // Trigger event
        $this->getEventManager()->trigger('user.registered', $this, ['username' => $username]);
    }
}

✅ Attaching Listeners


$userService = new \Application\Service\UserService();

// Attach listener
$userService->getEventManager()->attach('user.registered', function($e) {
    $params = $e->getParams();
    echo "Sending welcome email to " . $params['username'];
});

// Trigger event via method
$userService->registerUser('Alice');

✅ Shared Event Manager

The SharedEventManager allows attaching listeners across different classes.


use Zend\EventManager\SharedEventManager;

$sharedEvents = new SharedEventManager();
$sharedEvents->attach(\Application\Service\UserService::class, 'user.registered', function($e) {
    echo "Logging registration for " . $e->getParam('username');
});

$userService = new \Application\Service\UserService();
$userService->getEventManager()->setSharedManager($sharedEvents);

$userService->registerUser('Bob');

✅ Best Practices

  • Use events for cross-cutting concerns like logging, notifications, and caching.
  • Do not overuse events for simple method calls (keeps code clear).
  • Keep listeners lightweight; avoid heavy business logic in event callbacks.

✅ Exercise

  • Create a PostService that triggers a post.created event when a new post is added.
  • Attach a listener that sends a notification email on post creation.
  • Attach another listener that logs the post creation in a file.

🎉 Conclusion

With the EventManager, Zend Framework 3 applications can be extended with custom events and listeners. This promotes modular design and makes it easier to integrate logging, notifications, and external systems without modifying core logic.

Leave a Reply

Your email address will not be published. Required fields are marked *