Php Symfony4序列化程序出现异常属性名问题

Php Symfony4序列化程序出现异常属性名问题,php,symfony,symfony4,serialization,Php,Symfony,Symfony4,Serialization,我在Symfony4上制作了一个restapi,因此我想用默认的Symfony4序列化程序序列化我的实体 但我的实体有不寻常的属性名,这使得序列化程序给我带来了糟糕的结果 我尝试实现namecoverterinterface,也尝试了CamelCaseToSnakeCaseNameConverter,但没有得到好的结果 我的应用程序中的每个实体都有这种属性,因此带有@annotation的解决方案对我没有帮助 class Product implements EntityInterface {

我在Symfony4上制作了一个restapi,因此我想用默认的Symfony4序列化程序序列化我的实体

但我的实体有不寻常的属性名,这使得序列化程序给我带来了糟糕的结果

我尝试实现
namecoverterinterface
,也尝试了
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",
}
简单地等同于我实体中的属性名,我不明白为什么第一个字母变为小写,下划线变为下划线


谢谢你的帮助

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


在Symfony中,您可以实现自定义名称转换器来转换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;
    }
}

是的,我见过JMSSerializer,但是如果框架可以完成这项工作,为什么要使用外部依赖呢?我不明白为什么symfony序列化程序会以这种方式转换我的属性名……如果您使用像symfony这样的框架,您应该遵循它的方式,而且无论如何,您的方式可能会产生更多意想不到的行为(和头痛)。我希望您可以更改该命名类型。祝你好运。
不寻常的属性名称
-总有时间改进,所以请慢慢来!