/**
  * @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);
         }
     }
 }
Example #2
0
 /**
  * @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);
             }
         }
     }
 }