Symfony4 Serializer проблема с необычным именем свойства - PullRequest
1 голос
/ 19 апреля 2019

Я создаю REST API на Symfony4, поэтому я хотел бы сериализовать мою сущность с помощью сериализатора по умолчанию Symfony4.

Но у моих сущностей есть необычные имена атрибутов, которые делают сериализатор плохим результатом.

Я пытался реализовать NameConverterInterface, а также пытался CamelCaseToSnakeCaseNameConverter без хорошего результата ...

Каждый объект в моем приложении имеет такой тип атрибута, поэтому решение с @annotation не может мне помочь

class Product implements EntityInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer", name="PROD_PKEY")
     */
    private $PROD_PKEY;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $PROD_Name;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $PROD_Code;

А как я использую сериализатор:

$product = new Product();
$product->setPRODName("Name");
$product->setPRODCode("Code");

$json = $this->serializer->serialize($product, 'json');

Содержимое $ json:

{
    "pRODName": "Name",
    "pRODCode": "Code",
}

но я ожидаю что-то вроде этого:

{
    "PROD_Name": "Name",
    "PROD_Code": "Code",
}

Просто равняется моим именам атрибутов в моей сущности, я не понимаю, почему первая буква становится строчной, а моя буква подчеркивается ...

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

В Symfony вы можете реализовать собственный NameConverter для преобразования имен полей в вашем представлении json.

Что-то в этом духе должно сработать:

<?php namespace App\Service;

use Symfony\Component\Serializer\NameConverter\AdvancedNameConverterInterface;

class YourCustomNameConverter implements AdvancedNameConverterInterface
{
    public function normalize($propertyName, string $class = null, string $format = null, array $context = [])
    {
        preg_match('/^([a-z]?[A-Z]+)([A-Z]{1}[_a-zA-Z]+)$/', $propertyName, $matches);
        if (strstr($propertyName, 'PKEY')) {
            return ucfirst(substr_replace($propertyName, '_', -4, 0));
        } elseif (count($matches)) {
            array_shift($matches);
            $matches[0] = ucfirst($matches[0]);

            return implode('_', $matches);
        } else {
            return $propertyName;
        }
    }

    public function denormalize($propertyName, string $class = null, string $format = null, array $context = [])
    {
        return $propertyName;
    }
}
0 голосов
/ 19 апреля 2019

Я думаю, вам может понадобиться создать собственный сериализатор, я часто использую jmsserializer комплект и у меня не было проблем с ним

Как использовать JMSSerializer с Symfony 4.2

https://symfony.com/doc/current/serializer/custom_normalizer.html

...