Переопределить глобальный camelCase сериализатора JMS

Я хочу по умолчанию выводить имена регистров верблюдов, и этот ответ обеспечивает отличное решение.

$serializer= \JMS\Serializer\SerializerBuilder::create()
    ->setDebug(true)
    ->addMetadataDir(APP_ROOT.'/config/serializer')
    ->setPropertyNamingStrategy(new \JMS\Serializer\Naming\IdenticalPropertyNamingStrategy())
    ->build();

Я также хочу время от времени переопределять сериализованное имя, однако, когда это делается традиционным способом с использованием serialized-name, сериализатор не следует инструкциям и выводит idPublic вместо желаемого id. Если я удаляю глобальное переопределение для использования идентичных имен свойств, id выводится по желанию, однако очевидно, что все остальные свойства имеют змеиный регистр (т.е. other_property) и должны быть индивидуально настроены, что нежелательно.

<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
    <class name="Fully\Qualfied\ClassName" exclusion-policy="ALL">
        <property name="idPublic" serialized-name="id" expose="true"/>
        <property name="name" expose="true"/>
        <property name="otherProperty" expose="true"/>
    </class>
</serializer>

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="Fully\Qualfied\ClassName" table="systems">
    <id name="id" type="integer">
      <generator strategy="IDENTITY"/>
    </id>
    <field name="idPublic" type="integer" column="id_public"/>
    <field name="name" type="string"/>
    <field name="otherProperty" type="string" length="45" column="other_property"/>
  </entity>
</doctrine-mapping>

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

<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
    <class name="Fully\Qualfied\ClassName" exclusion-policy="ALL">
        <virtual-property method="getIdPublic" serialized-name="id" expose="true"/>
        <property name="name" expose="true"/>
        <property name="otherProperty" expose="true"/>
    </class>
</serializer>

Как можно переопределить глобальную конфигурацию JMS Serializer для использования идентичных имен?


person user1032531    schedule 30.03.2019    source источник


Ответы (1)


Не знаю, является ли это "правильным" способом сделать это, но он работает.

class SerializerNamingStrategy implements \JMS\Serializer\Naming\PropertyNamingStrategyInterface
{
    public function translateName(\JMS\Serializer\Metadata\PropertyMetadata $property)
    {
        return $property->serializedName??$property->name;
    }
}
person user1032531    schedule 30.03.2019