invalidElements = $invalidElements; parent::__construct($message, $code, $previous); } public static function fromInputFilter(InputFilterInterface $inputFilter, ?Throwable $prev = null): self { return static::fromArray($inputFilter->getMessages(), $prev); } public static function fromArray(array $invalidData, ?Throwable $prev = null): self { return new self('Provided data is not valid', $invalidData, -1, $prev); } public function getInvalidElements(): array { return $this->invalidElements; } public function __toString(): string { return sprintf( '%s %s in %s:%s%s%sStack trace:%s%s', __CLASS__, $this->getMessage(), $this->getFile(), $this->getLine(), $this->invalidElementsToString(), PHP_EOL, PHP_EOL, $this->getTraceAsString() ); } private function invalidElementsToString(): string { return reduce_left($this->invalidElements, function ($messageSet, string $name, $_, string $acc) { return $acc . sprintf( "\n '%s' => %s", $name, is_array($messageSet) ? print_r($messageSet, true) : $messageSet ); }, ''); } }