GraphNavigatorInterface::DIRECTION_SERIALIZATION, 'type' => FlattenException::class, 'format' => 'json', 'method' => 'serializeExceptionToJson', 'priority' => -1 ], [ 'direction' => GraphNavigatorInterface::DIRECTION_SERIALIZATION, 'type' => ValidationFailedException::class, 'format' => 'json', 'method' => 'serializeValidationExceptionToJson', 'priority' => -1 ]]; } public function serializeExceptionToJson(JsonSerializationVisitor $visitor, FlattenException $exception, array $type, Context $context) { if ($exception->getClass() !== ValidationFailedException::class) { return $this->exceptionHandler->serializeToJson($visitor, $exception, $type, $context); } $original = $context->getAttribute('exception'); if ($original instanceof ValidationFailedException) { return $this->serializeValidationExceptionToJson($visitor, $original, $type, $context); } return $this->exceptionHandler->serializeToJson($visitor, $exception, $type, $context); } public function serializeValidationExceptionToJson(JsonSerializationVisitor $visitor, ValidationFailedException $exception, array $type, Context $context) { $errors = []; /** @var ConstraintViolationInterface $error */ foreach (iterator_to_array($exception->getViolations()) as $error) { $errors[$error->getPropertyPath()]['errors'][] = $this->getErrorMessage($error); } return [ 'code' => '400', 'message' => $this->translator->trans($exception->getMessage(), [], 'validators'), 'errors' => [ 'children' => $errors ], ]; } private function getErrorMessage(ConstraintViolationInterface $error): string { $locale = \Locale::getDefault(); /** @var User $user */ $user = $this->security->getUser(); if ($user !== null) { $locale = $user->getLocale(); } if (null !== $error->getPlural()) { return $this->translator->trans($error->getMessageTemplate(), ['%count%' => $error->getPlural()] + $error->getParameters(), 'validators', $locale); } return $this->translator->trans($error->getMessageTemplate(), $error->getParameters(), 'validators', $locale); } }