【问题标题】:Symfony4 Serializer problem with unusual property nameSymfony4 序列化程序问题,属性名称异常
【发布时间】:2019-04-19 15:05:11
【问题描述】:

我在 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",
}

只是等于我实体中的属性名称,我不明白为什么第一个字母变成小写而我的下划线消失了......

感谢您的帮助!

【问题讨论】:

  • 如果你使用像 Symfony 这样的框架,你应该遵循它的Naming Conventions,无论如何你的方式可能会产生更多意想不到的行为(和令人头疼的问题)。我希望您可以更改该命名类型。祝你好运。
  • unusual attribute names - 总有时间改进,所以请慢慢来!

标签: php symfony symfony4 serialization


【解决方案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;
    }
}

【讨论】:

    【解决方案2】:

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

    How to use JMSSerializer with symfony 4.2

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

    【讨论】:

    • 是的,我看到了 JMSSerializer,但是如果框架可以完成这项工作,为什么还要使用外部依赖呢?我不明白为什么 symfony 序列化程序会以这种方式转换我的属性名称...
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多