Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
94.74% covered (success)
94.74%
18 / 19
95.24% covered (success)
95.24%
20 / 21
29.17% covered (danger)
29.17%
7 / 24
83.33% covered (warning)
83.33%
5 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
UnprocessableEntityHttpExceptionNormalizer
94.74% covered (success)
94.74%
18 / 19
95.24% covered (success)
95.24%
20 / 21
29.17% covered (danger)
29.17%
7 / 24
83.33% covered (warning)
83.33%
5 / 6
63.18
0.00% covered (danger)
0.00%
0 / 1
 supportsNormalization
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 normalizeErrors
92.86% covered (success)
92.86%
13 / 14
93.75% covered (success)
93.75%
15 / 16
10.53% covered (danger)
10.53%
2 / 19
0.00% covered (danger)
0.00%
0 / 1
42.10
 getSupportedTypes
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getErrorCode
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getMessage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getStatus
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace App\Normalizer;
4
5use App\Exception\ErrorCode;
6use App\Exception\ErrorMessage;
7use Symfony\Component\Clock\ClockAwareTrait;
8use Symfony\Component\HttpFoundation\Response;
9use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
10use Symfony\Component\Validator\Constraint;
11use Symfony\Component\Validator\Exception\ValidationFailedException;
12
13class UnprocessableEntityHttpExceptionNormalizer extends ExceptionNormalizer
14{
15    use ClockAwareTrait;
16
17    /**
18     * @param array<string, mixed> $context
19     */
20    public function supportsNormalization(mixed $data, ?string $format = null, array $context = []): bool
21    {
22        return $data instanceof UnprocessableEntityHttpException;
23    }
24
25    /**
26     * @return array<string, array<string, string[]|int[]>>
27     */
28    protected function normalizeErrors(\Throwable $throwable): array
29    {
30        if (!$throwable instanceof UnprocessableEntityHttpException) {
31            throw new \InvalidArgumentException();
32        }
33
34        /**
35         * @var ValidationFailedException $validationFailedException
36         */
37        $validationFailedException = $throwable->getPrevious();
38
39        $errorsAsArray = [];
40        foreach ($validationFailedException->getViolations() as $violation) {
41            $propertyPath = $violation->getPropertyPath();
42            /** @var class-string<Constraint> $constraintClass */
43            $constraintClass = $violation->getConstraint() ? $violation->getConstraint()::class : null;
44            $detailCode = $constraintClass ? $constraintClass::getErrorName($violation->getCode()) : 'UNKNOWN_ERROR';
45            if (!isset($errorsAsArray[$propertyPath])) {
46                $errorsAsArray[$propertyPath] = [];
47            }
48            if (!isset($errorsAsArray[$propertyPath][$detailCode])) {
49                $errorsAsArray[$propertyPath][$detailCode] = [];
50            }
51            $errorsAsArray[$propertyPath][$detailCode][strtolower($detailCode)] = $this->translator->translate($violation->getMessage());
52        }
53
54        return $errorsAsArray;
55    }
56
57    public function getSupportedTypes(?string $format): array
58    {
59        return [UnprocessableEntityHttpException::class => true];
60    }
61
62    #[\Override]
63    protected function getErrorCode(\Throwable $throwable): ErrorCode
64    {
65        return ErrorCode::VALIDATION_ERROR;
66    }
67
68    protected function getMessage(\Throwable $throwable): string
69    {
70        return ErrorMessage::VALIDATION_FAILED;
71    }
72
73    #[\Override]
74    protected function getStatus(\Throwable $throwable): int
75    {
76        return Response::HTTP_UNPROCESSABLE_ENTITY;
77    }
78}

Branches

Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

UnprocessableEntityHttpExceptionNormalizer->getErrorCode
63    protected function getErrorCode(\Throwable $throwable): ErrorCode
64    {
65        return ErrorCode::VALIDATION_ERROR;
66    }
UnprocessableEntityHttpExceptionNormalizer->getMessage
68    protected function getMessage(\Throwable $throwable): string
69    {
70        return ErrorMessage::VALIDATION_FAILED;
71    }
UnprocessableEntityHttpExceptionNormalizer->getStatus
74    protected function getStatus(\Throwable $throwable): int
75    {
76        return Response::HTTP_UNPROCESSABLE_ENTITY;
77    }
UnprocessableEntityHttpExceptionNormalizer->getSupportedTypes
57    public function getSupportedTypes(?string $format): array
58    {
59        return [UnprocessableEntityHttpException::class => true];
60    }
UnprocessableEntityHttpExceptionNormalizer->normalizeErrors
28    protected function normalizeErrors(\Throwable $throwable): array
29    {
30        if (!$throwable instanceof UnprocessableEntityHttpException) {
31            throw new \InvalidArgumentException();
37        $validationFailedException = $throwable->getPrevious();
38
39        $errorsAsArray = [];
40        foreach ($validationFailedException->getViolations() as $violation) {
40        foreach ($validationFailedException->getViolations() as $violation) {
41            $propertyPath = $violation->getPropertyPath();
42            /** @var class-string<Constraint> $constraintClass */
43            $constraintClass = $violation->getConstraint() ? $violation->getConstraint()::class : null;
43            $constraintClass = $violation->getConstraint() ? $violation->getConstraint()::class : null;
43            $constraintClass = $violation->getConstraint() ? $violation->getConstraint()::class : null;
43            $constraintClass = $violation->getConstraint() ? $violation->getConstraint()::class : null;
44            $detailCode = $constraintClass ? $constraintClass::getErrorName($violation->getCode()) : 'UNKNOWN_ERROR';
44            $detailCode = $constraintClass ? $constraintClass::getErrorName($violation->getCode()) : 'UNKNOWN_ERROR';
44            $detailCode = $constraintClass ? $constraintClass::getErrorName($violation->getCode()) : 'UNKNOWN_ERROR';
44            $detailCode = $constraintClass ? $constraintClass::getErrorName($violation->getCode()) : 'UNKNOWN_ERROR';
45            if (!isset($errorsAsArray[$propertyPath])) {
46                $errorsAsArray[$propertyPath] = [];
47            }
48            if (!isset($errorsAsArray[$propertyPath][$detailCode])) {
48            if (!isset($errorsAsArray[$propertyPath][$detailCode])) {
49                $errorsAsArray[$propertyPath][$detailCode] = [];
50            }
51            $errorsAsArray[$propertyPath][$detailCode][strtolower($detailCode)] = $this->translator->translate($violation->getMessage());
40        foreach ($validationFailedException->getViolations() as $violation) {
41            $propertyPath = $violation->getPropertyPath();
42            /** @var class-string<Constraint> $constraintClass */
43            $constraintClass = $violation->getConstraint() ? $violation->getConstraint()::class : null;
44            $detailCode = $constraintClass ? $constraintClass::getErrorName($violation->getCode()) : 'UNKNOWN_ERROR';
45            if (!isset($errorsAsArray[$propertyPath])) {
46                $errorsAsArray[$propertyPath] = [];
47            }
48            if (!isset($errorsAsArray[$propertyPath][$detailCode])) {
49                $errorsAsArray[$propertyPath][$detailCode] = [];
50            }
51            $errorsAsArray[$propertyPath][$detailCode][strtolower($detailCode)] = $this->translator->translate($violation->getMessage());
40        foreach ($validationFailedException->getViolations() as $violation) {
41            $propertyPath = $violation->getPropertyPath();
42            /** @var class-string<Constraint> $constraintClass */
43            $constraintClass = $violation->getConstraint() ? $violation->getConstraint()::class : null;
44            $detailCode = $constraintClass ? $constraintClass::getErrorName($violation->getCode()) : 'UNKNOWN_ERROR';
45            if (!isset($errorsAsArray[$propertyPath])) {
46                $errorsAsArray[$propertyPath] = [];
47            }
48            if (!isset($errorsAsArray[$propertyPath][$detailCode])) {
49                $errorsAsArray[$propertyPath][$detailCode] = [];
50            }
51            $errorsAsArray[$propertyPath][$detailCode][strtolower($detailCode)] = $this->translator->translate($violation->getMessage());
52        }
53
54        return $errorsAsArray;
55    }
UnprocessableEntityHttpExceptionNormalizer->supportsNormalization
20    public function supportsNormalization(mixed $data, ?string $format = null, array $context = []): bool
21    {
22        return $data instanceof UnprocessableEntityHttpException;
23    }
{main}
3namespace App\Normalizer;
4
5use App\Exception\ErrorCode;
6use App\Exception\ErrorMessage;
7use Symfony\Component\Clock\ClockAwareTrait;
8use Symfony\Component\HttpFoundation\Response;
9use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
10use Symfony\Component\Validator\Constraint;
11use Symfony\Component\Validator\Exception\ValidationFailedException;
12
13class UnprocessableEntityHttpExceptionNormalizer extends ExceptionNormalizer
14{
15    use ClockAwareTrait;
16
17    /**
18     * @param array<string, mixed> $context
19     */
20    public function supportsNormalization(mixed $data, ?string $format = null, array $context = []): bool
21    {
22        return $data instanceof UnprocessableEntityHttpException;
23    }
24
25    /**
26     * @return array<string, array<string, string[]|int[]>>
27     */
28    protected function normalizeErrors(\Throwable $throwable): array
29    {
30        if (!$throwable instanceof UnprocessableEntityHttpException) {
31            throw new \InvalidArgumentException();
32        }
33
34        /**
35         * @var ValidationFailedException $validationFailedException
36         */
37        $validationFailedException = $throwable->getPrevious();
38
39        $errorsAsArray = [];
40        foreach ($validationFailedException->getViolations() as $violation) {
41            $propertyPath = $violation->getPropertyPath();
42            /** @var class-string<Constraint> $constraintClass */
43            $constraintClass = $violation->getConstraint() ? $violation->getConstraint()::class : null;
44            $detailCode = $constraintClass ? $constraintClass::getErrorName($violation->getCode()) : 'UNKNOWN_ERROR';
45            if (!isset($errorsAsArray[$propertyPath])) {
46                $errorsAsArray[$propertyPath] = [];
47            }
48            if (!isset($errorsAsArray[$propertyPath][$detailCode])) {
49                $errorsAsArray[$propertyPath][$detailCode] = [];
50            }
51            $errorsAsArray[$propertyPath][$detailCode][strtolower($detailCode)] = $this->translator->translate($violation->getMessage());
52        }
53
54        return $errorsAsArray;
55    }
56
57    public function getSupportedTypes(?string $format): array
58    {
59        return [UnprocessableEntityHttpException::class => true];
60    }
61
62    #[\Override]
63    protected function getErrorCode(\Throwable $throwable): ErrorCode
64    {
65        return ErrorCode::VALIDATION_ERROR;
66    }
67
68    protected function getMessage(\Throwable $throwable): string
69    {
70        return ErrorMessage::VALIDATION_FAILED;
71    }
72
73    #[\Override]
74    protected function getStatus(\Throwable $throwable): int
75    {
76        return Response::HTTP_UNPROCESSABLE_ENTITY;
77    }