first-programmer
@first-programmer
Backend software engineer

Как в Symfony сконфигурировать serializer?

Всем привет, столкнулся со странной проблемой, которую пока не понимаю, как решить

Для кода типа такого

return $this->serializer->deserialize(
			$result,
			ResponseSuccessPayment::class,
			'json',
			[
				AbstractNormalizer::CALLBACKS => [
					'status' => function ($status) {
						return match ($status) {
							0 => StatusEnum::TRANSACTION_STATUS_SUCCESS,
							1 => StatusEnum::TRANSACTION_STATUS_IN_PROCESS,
							2 => StatusEnum::TRANSACTION_STATUS_FAIL,
							default => null,
						};
					}
				],
				AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT => true
			]
		);


Использовал настройку сериалайзера прямо в конструкторе

$normalizers = [
			new BackedEnumNormalizer(),
			new ObjectNormalizer(),
			new ArrayDenormalizer(),
		];

		$this->serializer = new Serializer($normalizers, [new JsonEncoder()]);


Что разумеется моветон, после того как все протестировал, решил перенести настройку в конфигурацию di контейнера в yaml

services:
    App\Services\ SomeApi\ApiService:
        public: true
        arguments:
            $someApi: '@http_client'
            $serializer: '@Symfony\Component\Serializer\Serializer'
            $logger: '@logger'

    # Конфигурация сериализатора
    Symfony\Component\Serializer\Serializer:
        class: Symfony\Component\Serializer\Serializer
        arguments:
            - # Массив нормализаторов
                - '@Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer'
                - '@Symfony\Component\Serializer\Normalizer\ObjectNormalizer'
                - '@Symfony\Component\Serializer\Normalizer\ArrayDenormalizer'
            - # Массив энкодеров
                - '@Symfony\Component\Serializer\Encoder\JsonEncoder'


И тут возникает проблема

[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException]
  The service "Symfony\Component\Serializer\Serializer" has a dependency on a non-existent ser
  vice "Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer".


То есть через use все норм видит, все работает как надо, а если обращаюсь к этому классу в конфигурации сервисов, то не видит. Та же ерунда с классами ArrayDenormalizer и JsonEncoder. При этом с классом ObjectNormalizer такой проблемы нет.

В чем может быть проблема? Можете у себя определить попробовать такой конфиг и глянуть найдет ли он классы эти.

UPD:

Походу сам ответил на свой вопрос, хотя до того как опубликовал часа 2 сидел пытался понять в чем проблема. Нужно типа в конфиге определять как именно сервисы те классы, к которым ты будешь обращаться по ссылке

Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer:
class: Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer

Symfony\Component\Serializer\Normalizer\ArrayDenormalizer:
class: Symfony\Component\Serializer\Normalizer\ArrayDenormalizer

Symfony\Component\Serializer\Encoder\JsonEncoder:
class: Symfony\Component\Serializer\Encoder\JsonEncoder

На мой взгляд конечно не понятно. Почему нельзя сразу передавать как аргумент просто имя класса и все, пусть там делает что хочет дальше. Наверно просто я не копался в нутряное особо и не вкуривал этот момент, надо будет разобраться.

Но тут появилась новая проблема, поэтому удалил свой ответ и перенес в UPD:

Почему-то нормалайзер для енамов перестал работать и теперь получаю ошибку, как получал до того, как добавил этот нормализатор в настройки сериалайзера

1 is not a valid backing value for enum "App\Enum\StatusEnum
/app/vendor/symfony/serializer/Exception/NotNormalizableValueException.php
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы