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
PostServicethat triggers apost.createdevent 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.
