Переопределить глобальный CamelCase JMS Serializer - PullRequest
0 голосов
/ 30 марта 2019

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

$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 для использования идентичных имен?

1 Ответ

0 голосов
/ 30 марта 2019

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

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