/** * Lookup the document class to find methods that match to event lifecycle names * * @param ClassMetadata $metadata The document metadata. * @param string $className The listener class name. * * @throws MappingException When the listener class not found. */ public static function bindDocumentListener(ClassMetadata $metadata, $className) { $class = $metadata->fullyQualifiedClassName($className); if (!class_exists($class)) { throw MappingException::documentListenerClassNotFound($class, $className); } foreach (get_class_methods($class) as $method) { if (!isset(self::$events[$method])) { continue; } $metadata->addDocumentListener($method, $class, $method); } }
/** * @param string $className * @param ClassMetadata $metadata * @param DocumentListeners $annot * * @throws MappingException */ private function mapDocumentListeners($className, ClassMetadata $metadata, DocumentListeners $annot) { foreach ($annot->value as $item) { $listenerClassName = $metadata->fullyQualifiedClassName($item); if (!class_exists($listenerClassName)) { throw MappingException::documentListenerClassNotFound($listenerClassName, $className); } $hasMapping = false; $listenerClass = new \ReflectionClass($listenerClassName); /* @var $method \ReflectionMethod */ foreach ($listenerClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) { // find method callbacks. $callbacks = $this->getMethodCallbacks($method); $hasMapping = $hasMapping ?: !empty($callbacks); foreach ($callbacks as $value) { $metadata->addDocumentListener($value[1], $listenerClassName, $value[0]); } } // Evaluate the listener using naming convention. if (!$hasMapping) { DocumentListenerBuilder::bindDocumentListener($metadata, $listenerClassName); } } }
/** * Adds a document listener for documents of this class. * * @param string $eventName The document lifecycle event. * @param string $class The listener class. * @param string $method The listener callback method. * * @throws MappingException */ public function addDocumentListener($eventName, $class, $method) { $class = $this->fullyQualifiedClassName($class); $listener = ['class' => $class, 'method' => $method]; if (!class_exists($class)) { throw MappingException::documentListenerClassNotFound($class, $this->name); } if (!method_exists($class, $method)) { throw MappingException::documentListenerMethodNotFound($class, $method, $this->name); } if (isset($this->documentListeners[$eventName]) && in_array($listener, $this->documentListeners[$eventName])) { throw MappingException::duplicateDocumentListener($class, $method, $this->name); } $this->documentListeners[$eventName][] = $listener; }