예제 #1
0
 /**
  * Apply the given aggregate-event to it's corresponding aggregate and return the resulting source-event.
  *
  * @param EmbeddedEntityEventInterface $embedded_entity_event
  * @param boolean $auto_commit
  *
  * @return EmbeddedEntityEventInterface
  */
 protected function applyEmbeddedEntityEvent(EmbeddedEntityEventInterface $embedded_entity_event, $auto_commit = true)
 {
     $attribute_name = $embedded_entity_event->getParentAttributeName();
     $embedded_entity_list = $this->getValue($attribute_name);
     if ($embedded_entity_event instanceof EmbeddedEntityAddedEvent) {
         $embedded_type = $this->getEmbeddedEntityTypeFor($attribute_name, $embedded_entity_event->getEmbeddedEntityType());
         $embedded_entity = $embedded_type->createEntity([], $this);
         $embedded_entity_list->push($embedded_entity);
     } elseif ($embedded_entity_event instanceof EmbeddedEntityRemovedEvent) {
         $embedded_entity = $this->getEmbeddedEntityFor($attribute_name, $embedded_entity_event->getEmbeddedEntityIdentifier());
         $embedded_entity_list->removeItem($embedded_entity);
         if (!$embedded_entity) {
             error_log(__METHOD__ . " - Embedded entity already was removed.");
             return $embedded_entity_event;
         }
     } elseif ($embedded_entity_event instanceof EmbeddedEntityModifiedEvent) {
         $embedded_entity = $this->getEmbeddedEntityFor($attribute_name, $embedded_entity_event->getEmbeddedEntityIdentifier());
         if (!$embedded_entity) {
             throw new RuntimeError('Unable to resolve embedded-entity for embed-event: ' . json_encode($embedded_entity_event->toArray()) . "\nAR-Id: " . $this->getIdentifier());
         }
         if ($embedded_entity_list->getKey($embedded_entity) !== $embedded_entity_event->getPosition()) {
             $embedded_entity_list->moveTo($embedded_entity_event->getPosition(), $embedded_entity);
         }
     }
     return $embedded_entity->applyEvent($embedded_entity_event, $auto_commit);
 }
예제 #2
0
 protected function getEmbeddedEntityTypeFor(EntityInterface $projection, EmbeddedEntityEventInterface $event)
 {
     $embed_attribute = $projection->getType()->getAttribute($event->getParentAttributeName());
     return $embed_attribute->getEmbeddedTypeByPrefix($event->getEmbeddedEntityType());
 }