/** * 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); } } }