Exemple #1
0
 protected function applyValues(EmbeddedEntityEventInterface $event)
 {
     if (!is_callable([$event, 'getData'])) {
         throw new RuntimeError('Event instance is not support due to lack of a getData method.');
     }
     $this->setValues($event->getData());
     if (!$this->isValid()) {
         foreach ($this->getValidationResults() as $validation_result) {
             foreach ($validation_result->getViolatedRules() as $violated_rule) {
                 foreach ($violated_rule->getIncidents() as $incident) {
                     $errors[] = PHP_EOL . $validation_result->getSUbject()->getName() . ' - ' . $violated_rule->getName() . ' > ' . $incident->getName() . ', params: ' . var_export($incident->getParameters(), true);
                 }
             }
         }
         error_log(sprintf("Corrupt event data given to %s through event %s.\nErrors:%s", $this->getType()->getPrefix(), $event->getType(), implode(PHP_EOL, $errors)));
     }
     $embedded_entity_events = new EmbeddedEntityEventList();
     foreach ($event->getEmbeddedEntityEvents() as $embedded_event) {
         $embedded_entity_events->push($this->applyEmbeddedEntityEvent($embedded_event));
     }
     $source_event = $event;
     $recorded_changes = $this->getRecordedChanges();
     if (!empty($recorded_changes)) {
         $source_event = $event->createCopyWith(['data' => $recorded_changes, 'embedded_entity_events' => $embedded_entity_events]);
     }
     return $source_event;
 }
 protected function buildEvent(array $event_state)
 {
     $event_type_class = $event_state['@type'];
     $embedded_entity_events = new EmbeddedEntityEventList();
     foreach ($event_state['embedded_entity_events'] as $embedded_event_state) {
         $embedded_entity_events->push($this->buildEvent($embedded_event_state));
     }
     $event_state['embedded_entity_events'] = $embedded_entity_events;
     return new $event_type_class($event_state);
 }
Exemple #3
0
 /**
  * Takes an event and applies the resulting state change to the aggregate-root's internal state.
  *
  * @param AggregateRootEventInterface $event
  * @param bool $auto_commit Whether to directly add the given event to the uncomitted-events list.
  *
  * @return AggregateRootEventInterface Event that is acutally applied and comitted or false if the AR is invalid.
  */
 protected function applyEvent(AggregateRootEventInterface $event, $auto_commit = true)
 {
     $this->guardEventPreConditions($event);
     if (!$this->setValues($event->getData())) {
         foreach ($this->getValidationResults() as $validation_result) {
             foreach ($validation_result->getViolatedRules() as $violated_rule) {
                 foreach ($violated_rule->getIncidents() as $incident) {
                     $errors[] = PHP_EOL . $validation_result->getSUbject()->getName() . ' - ' . $violated_rule->getName() . ' > ' . $incident->getName() . ': ' . print_r($incident->getParameters(), true);
                 }
             }
         }
         throw new RuntimeError(sprintf("Aggregate-root is in an invalid state after applying %s.\nErrors:%s", get_class($event), implode(PHP_EOL, $errors)));
     }
     $embedded_entity_events = new EmbeddedEntityEventList();
     foreach ($event->getEmbeddedEntityEvents() as $embedded_entity_event) {
         $embedded_entity_events->push($this->applyEmbeddedEntityEvent($embedded_entity_event));
     }
     $source_event = null;
     if ($auto_commit) {
         $recorded_changes = $this->getRecordedChanges();
         if (!empty($recorded_changes) || !$embedded_entity_events->isEmpty()) {
             $source_event = $event->createCopyWith(['data' => $recorded_changes, 'embedded_entity_events' => $embedded_entity_events]);
             $this->uncomitted_events_list->push($source_event);
             $this->history->push($source_event);
         }
     } else {
         $source_event = $event;
     }
     if ($source_event) {
         $this->setValue('revision', $source_event->getSeqNumber());
         $this->markClean();
     } else {
         $notice = 'Applied event %s for %s did not trigger any state changes, so it is being dropped ...';
         error_log(sprintf($notice, $event, $this));
     }
     return $source_event;
 }