ValidationException.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shlinkio\Shlink\Core\Exception;
  4. use Fig\Http\Message\StatusCodeInterface;
  5. use Laminas\InputFilter\InputFilterInterface;
  6. use Mezzio\ProblemDetails\Exception\CommonProblemDetailsExceptionTrait;
  7. use Mezzio\ProblemDetails\Exception\ProblemDetailsExceptionInterface;
  8. use Throwable;
  9. use function array_keys;
  10. use function Functional\reduce_left;
  11. use function is_array;
  12. use function print_r;
  13. use function sprintf;
  14. use const PHP_EOL;
  15. class ValidationException extends InvalidArgumentException implements ProblemDetailsExceptionInterface
  16. {
  17. use CommonProblemDetailsExceptionTrait;
  18. private const TITLE = 'Invalid data';
  19. private const TYPE = 'INVALID_ARGUMENT';
  20. private array $invalidElements;
  21. public static function fromInputFilter(InputFilterInterface $inputFilter, ?Throwable $prev = null): self
  22. {
  23. return static::fromArray($inputFilter->getMessages(), $prev);
  24. }
  25. public static function fromArray(array $invalidData, ?Throwable $prev = null): self
  26. {
  27. $status = StatusCodeInterface::STATUS_BAD_REQUEST;
  28. $e = new self('Provided data is not valid', $status, $prev);
  29. $e->detail = $e->getMessage();
  30. $e->title = self::TITLE;
  31. $e->type = self::TYPE;
  32. $e->status = StatusCodeInterface::STATUS_BAD_REQUEST;
  33. $e->invalidElements = $invalidData;
  34. $e->additional = ['invalidElements' => array_keys($invalidData)];
  35. return $e;
  36. }
  37. public function getInvalidElements(): array
  38. {
  39. return $this->invalidElements;
  40. }
  41. public function __toString(): string
  42. {
  43. return sprintf(
  44. '%s %s in %s:%s%s%sStack trace:%s%s',
  45. __CLASS__,
  46. $this->getMessage(),
  47. $this->getFile(),
  48. $this->getLine(),
  49. $this->invalidElementsToString(),
  50. PHP_EOL,
  51. PHP_EOL,
  52. $this->getTraceAsString(),
  53. );
  54. }
  55. private function invalidElementsToString(): string
  56. {
  57. return reduce_left($this->getInvalidElements(), fn ($messages, string $name, $_, string $acc) => $acc . sprintf(
  58. "\n '%s' => %s",
  59. $name,
  60. is_array($messages) ? print_r($messages, true) : $messages,
  61. ), '');
  62. }
  63. }