属性名称异常的Symfony4序列化程序问题

时间:2019-04-19 15:05:12

标签: php symfony symfony4 serializer

我在Symfony4上制作了REST API,因此我想使用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 个答案:

答案 0 :(得分:1)

在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;
    }
}

答案 1 :(得分:0)

我认为您可能需要创建一个自定义序列化程序,我经常使用jmsserializer捆绑包,但没有任何问题

How to use JMSSerializer with symfony 4.2

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