Example #1
0
 /**
  * {@inheritDoc}
  */
 public function apply(PropertyMetadata $propertyMetadata, array $collectedValues, MergeContext $context)
 {
     $reflectionProperty = $propertyMetadata->reflection;
     $mergeableObjectCollection = $context->getPropertyAccessor()->getValue($reflectionProperty, $context->getMergeTo());
     foreach ($collectedValues['missing'] as $missingValue) {
         $mergeableObjectCollection[] = $missingValue;
     }
     $context->getPropertyAccessor()->setValue($reflectionProperty, $context->getMergeTo(), $mergeableObjectCollection);
 }
Example #2
0
 /**
  * Walks over the objectproperties which are marked as mergeable.
  *
  * @param object        $mergeFrom
  * @param object        $mergeTo
  * @param ClassMetadata $classMetadata
  *
  * @throws \Exception
  */
 protected function walkProperties($mergeFrom, $mergeTo, $classMetadata)
 {
     // Preventing the object to be visited again.
     $this->visitedObjects[spl_object_hash($mergeFrom)] = true;
     // Preparing a new MergeContext.
     $mergeContext = new MergeContext($classMetadata, $this, $mergeFrom, $mergeTo);
     // Dispatching the premerge event.
     $this->eventDispatcher->dispatch(Events::PRE_MERGE, new MergeEvent(MergeEvent::TYPE_PRE, $mergeContext));
     foreach ($classMetadata->propertyMetadata as $comparableProperty) {
         /** @var PropertyMetadata $comparableProperty */
         if ($comparableProperty->ignoreNullValue) {
             $currentValue = $mergeContext->getPropertyAccessor()->getValue($comparableProperty->reflection, $mergeContext->getMergeFrom());
             if (null === $currentValue) {
                 continue;
             }
         }
         switch ($comparableProperty->type) {
             case 'string':
             case 'object':
             case 'boolean':
             case 'mixed':
                 // calls a type specified merge method on the visitor.
                 $this->visitor->{'merge' . ucfirst($comparableProperty->type)}($comparableProperty, $mergeContext);
                 break;
             default:
                 // If the type is not one of the default types, try to merge this property by a handler.
                 try {
                     $this->visitor->mergeByHandler($comparableProperty, $mergeContext);
                 } catch (\Exception $e) {
                     throw $e;
                 }
                 break;
         }
     }
     // Dispatching the postmerge event.
     $this->eventDispatcher->dispatch(Events::POST_MERGE, new MergeEvent(MergeEvent::TYPE_POST, $mergeContext));
 }
Example #3
0
 /**
  * Merges an object property.
  *
  * @param PropertyMetadata $property Metadata of the property
  * @param MergeContext     $context  The current mergingcontext
  */
 public function mergeObject(PropertyMetadata $property, MergeContext $context)
 {
     $reflectionProperty = $property->reflection;
     $leftValue = $context->getPropertyAccessor()->getValue($reflectionProperty, $context->getMergeFrom());
     $rightValue = $context->getPropertyAccessor()->getValue($reflectionProperty, $context->getMergeTo());
     if (null === $rightValue) {
         $context->getPropertyAccessor()->setValue($reflectionProperty, $context->getMergeTo(), $leftValue);
     } else {
         $context->getGraphWalker()->accept($leftValue, $rightValue);
     }
 }