Использование разных стратегий именования для каждого класса с JMS и Symfony 3.4

Здравствуйте, уважаемое сообщество Stackoverflow,

У меня есть 2 класса PHP (считается DTO), которые я использую для установки тела своих HTTP-вызовов. Каждый DTO используется для другого API с разными стратегиями именования (один использует camelCase, а другой использует змеиный регистр.

Я не могу найти решение для внедрения в мой сериализатор JMS другой стратегии именования для каждого из этих классов.

Вот моя текущая конфигурация для JMS:

jms_serializer:
    default_context:
        serialization:
            serialize_null: false
        deserialization:
            serialize_null: false
    property_naming:
        id: 'jms_serializer.identical_property_naming_strategy'

Вот мое определение услуг:

ApiBundle\Services\ApiOneService:
    arguments:
        - '%external_components%'
        - '@jms_serializer'
        - '@monolog.logger'

ApiBundle\Service\ApiTwoService:
    arguments:
        - '%external_components%'
        - '@jms_serializer'

Примечание. Я не могу использовать аннотацию @SerializedName, потому что она не работает, если вы укажете стратегию именования, как указано в документации JMS https://jmsyst.com/libs/serializer/master/reference/annotations#serializedname

Есть ли способ «скопировать» мой JMS-сервис в my services.yml и просто изменить стратегию именования для моего ApiTwoService? Или любое другое решение?

С наилучшими пожеланиями.


person Ga3tan    schedule 07.04.2020    source источник
comment
Здравствуйте, вы проверили эту проблему на github?   -  person Eugene Ruban    schedule 07.04.2020
comment
Спасибо за вашу помощь, Евгений, к сожалению, это меняет стратегию именования для всех свойств во всех классах. Я хотел бы использовать определенную стратегию именования для определенного класса. Например, camelCase для свойств класса A и snake_case для свойств класса B.   -  person Ga3tan    schedule 07.04.2020
comment
не могли бы вы просто создать другой локальный сериализатор в своей второй службе?   -  person Jakumi    schedule 07.04.2020


Ответы (1)


вы можете установить NamingStrategy при создании сериализатора, но для предварительного просмотра с помощью Swagger он у меня не работает

 public function getApiResponse($entity, $groups = [], $asResponse = true)
{
    $serializer = SerializerBuilder::create();
    $serializer->setPropertyNamingStrategy(new SerializedNameAnnotationStrategy(new IdenticalPropertyNamingStrategy()));
    $serializer = $serializer->build();

    $context = null;
    if (sizeof($groups) > 0) {
        $context = SerializationContext::create()->setGroups($groups);
    }

    $result = $serializer->serialize($entity, 'json', $context);
    if ($asResponse == false) {
        return $result;
    }

    return new JsonResponse($result, 200, [], true);
}
person David from Studio.201    schedule 24.07.2020