/** * @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); } } }
/** * @inheritdoc */ public function loadMetadataForClass($className, \Doctrine\Common\Persistence\Mapping\ClassMetadata $metadata) { /* @var $metadata ClassMetadata */ /* @var $xmlRoot SimpleXMLElement */ $xmlRoot = $this->getElement($className); switch ($xmlRoot->getName()) { case 'document': $metadata->setIsDocument(); break; case 'vertex': $metadata->setIsDocument(); $metadata->setIsVertex(); break; case 'relationship': $metadata->setIsDocument(); $metadata->setIsEdge(); break; case 'embedded-document': $metadata->setIsEmbeddedDocument(); break; case 'mapped-superclass': $metadata->setIsMappedSuperclass(); break; default: throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className); } if (isset($xmlRoot['repository-class'])) { $metadata->setCustomRepositoryClass((string) $xmlRoot['repository-class']); } if (isset($xmlRoot['oclass'])) { $metadata->setOrientClass((string) $xmlRoot['oclass']); } if (isset($xmlRoot['abstract']) && (string) $xmlRoot['abstract'] === 'true') { $metadata->setIsAbstract(); } if (isset($xmlRoot->{'rid'})) { $field = $xmlRoot->{'rid'}; $metadata->mapRid((string) $field['fieldName']); } if (isset($xmlRoot->{'version'})) { $field = $xmlRoot->{'version'}; $metadata->mapVersion((string) $field['fieldName']); } if ($metadata->isEdge()) { if (isset($xmlRoot->{'in'})) { $mapping = []; $this->_copyCommonPropertyAttributesToMapping($xmlRoot->{'in'}->attributes(), $mapping); $metadata->mapVertexLink($mapping, 'in'); } if (isset($xmlRoot->{'out'})) { $mapping = []; $this->_copyCommonPropertyAttributesToMapping($xmlRoot->{'out'}->attributes(), $mapping); $metadata->mapVertexLink($mapping, 'out'); } } // Evaluate <change-tracking-policy...> if (isset($xmlRoot['change-tracking-policy'])) { $metadata->setChangeTrackingPolicy(constant(sprintf('%s::CHANGETRACKING_%s', ClassMetadata::class, strtoupper((string) $xmlRoot['change-tracking-policy'])))); } if (isset($xmlRoot->field)) { $this->readFields($metadata, $xmlRoot); } if (isset($xmlRoot->{'embed-one'})) { foreach ($xmlRoot->{'embed-one'} as $node) { $this->addEmbedMapping($metadata, $node, 'one'); } } if (isset($xmlRoot->{'embed-many'})) { foreach ($xmlRoot->{'embed-many'} as $node) { $type = isset($node['collection']) ? (string) $node['collection'] : 'list'; $this->addEmbedMapping($metadata, $node, $type); } } if (isset($xmlRoot->{'link-one'})) { foreach ($xmlRoot->{'link-one'} as $node) { $this->addLinkMapping($metadata, $node, 'one'); } } if (isset($xmlRoot->{'link-many'})) { foreach ($xmlRoot->{'link-many'} as $node) { $type = isset($node['collection']) ? (string) $node['collection'] : 'list'; $this->addLinkMapping($metadata, $node, $type); } } if (isset($xmlRoot->{'related-to'})) { foreach ($xmlRoot->{'related-to'} as $node) { $this->addRelatedToMapping($metadata, $node); } } if (isset($xmlRoot->{'related-to-via'})) { foreach ($xmlRoot->{'related-to-via'} as $node) { $this->addRelatedToMapping($metadata, $node, false); } } // Evaluate entity listener if (isset($xmlRoot->{'document-listeners'})) { /** @var SimpleXMLElement $listenerElement */ foreach ($xmlRoot->{'document-listeners'}->{'document-listener'} as $listenerElement) { $className = (string) $listenerElement['class']; // Evaluate the listener using naming convention. if ($listenerElement->count() === 0) { DocumentListenerBuilder::bindDocumentListener($metadata, $className); continue; } foreach ($listenerElement as $callbackElement) { $eventName = (string) $callbackElement['type']; $methodName = (string) $callbackElement['method']; $metadata->addDocumentListener($eventName, $className, $methodName); } } } }