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); }
/** * 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; }