Всем привет, столкнулся со странной проблемой, которую пока не понимаю, как решить
Для кода типа такого
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