Symfony 3.3.8 игнорирует пользовательский нормализатор

почему symfony игнорирует мой пользовательский нормализатор?

SRC / AppBundle / Serializer / нормализатор / ExceptionNormalizer.php

<?php

namespace AppBundle\Serializer\Normalizer;

use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

/**
* Class ExceptionNormalizer
*/
class ExceptionNormalizer implements NormalizerInterface
{
/**
* {@inheritdoc}
*/
public function normalize($object, $format = null, array $context = array()): array
{
return [];
}

/**
* {@inheritdoc}
*/
public function supportsNormalization($data, $format = null): bool
{
return $data instanceof \Exception;
}
}

SRC / AppBundle / Ресурсы / конфигурации / services.yml

services:
...
app.normalizer.exception:
class: AppBundle\Serializer\Normalizer\ExceptionNormalizer
tags:
- { name: serializer.normalizer }

приложение / Config / config.yml

imports:
- { resource: parameters.yml }
- { resource: security.yml }
#- { resource: services.yml } exclude default services file
- { resource: "@AppBundle/Resources/config/services.yml" }

Выход исключения

{«error»: {«code»: 404, «message»: «Not Found», «exception»: [{«message»: «AppBundle \ Entity \ User object not found.», «class»: «Symfony \» Составная часть…..

Ожидаемое исключение вывода

{}

0

Решение

Вы не должны нормализовать исключение. Вместо этого создайте прослушиватель для этого вида исключения, обработайте его (например, запишите в журнал) и верните желаемый вывод в качестве ответа.

class ExceptionListener
{
/** @var LoggerInterface */
private $logger;public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}

public function onKernelException(GetResponseForExceptionEvent $event)
{
$e = $event->getException();
if ($e instanceof ValidationException) {
$event->setResponse(new JsonResponse(['error' => $e->getViolations()], 422)
} elseif ($e instanceof DomainException) {
$this->logger->warning('Exception ' . get_class($e) , ['message' => $e->getMessage()]);
$event->setResponse(
new JsonResponse(['error' => 'Something is wrong with your request.'], 400);
} elseif ($e instanceof NotFoundHttpException) {
$event->setResponse(new JsonResponse(['error' => 'Not found.'], 404);
} else {
$event->setResponse(new JsonResponse(['error' => $this->translator->trans('http.internal_server_error')], 500);
}
}

}

Обновление services.yml

  app.exception_listener:
class: Application\Listeners\ExceptionListener
arguments: ['@domain.logger']
tags:
- { name: kernel.event_listener, event: kernel.exception }

Дальнейшее чтение о слушателях и событиях https://symfony.com/doc/current/event_dispatcher.html

Ваш нормализатор, скорее всего, игнорируется, потому что вы не зарегистрировали его в сериализаторе.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector