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 { $status = StatusCodeInterface::STATUS_BAD_REQUEST; $e = new self('Provided data is not valid', $invalidData, $status, $prev); $e->detail = $e->getMessage(); $e->title = self::TITLE; $e->type = self::TYPE; $e->status = StatusCodeInterface::STATUS_BAD_REQUEST; $e->additional = [ 'invalidElements' => $invalidData, ]; return $e; } 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 ); }, ''); } }