/** * Registers a new event with this manager under a specific event name. * If you attempt to register already registered event nothing happens unless * the classes mismatch. In that case an exception is thrown. * @param string $eventName Name of the event that is being registered. * @param RegisteredEvent $registeredEvent The class instance to use for this event. * @throws EventAlreadyRegisteredException on critical failure * @return bool True on success, false on failure. */ public function register($eventName, RegisteredEvent $registeredEvent) { self::assertValidName($registeredEvent->getClassName(), 'Event registration failed: Invalid event class name.'); // check if it is registered first - it also validates the name, no need to do that twice if ($this->isRegistered($eventName)) { // check whether the event we are registering is the same class (or subclass) of what we have already registered if (is_a($registeredEvent->getClassName(), $this->events[$eventName]->getClassName(), true)) { $this->log('Event {name} has been previously registered, skipping request.', array('name' => $eventName), LogLevels::DEBUG); } else { throw new EventAlreadyRegisteredException('Event registration failed: Event ' . $eventName . ' has been previously registered with a different class name (' . $this->events[$eventName]->getClassName() . ').'); } return false; } $this->events[$eventName] = $registeredEvent; $this->log('Registered event {name} (with class {class}).', array('name' => $eventName, 'class' => $registeredEvent->getClassName()), LogLevels::DEBUG); return true; }