JMS序列化程序忽略了doctrine实体ID

时间:2017-04-19 14:24:11

标签: php symfony serialization jmsserializerbundle

我尝试使用jms序列化器(在单元测试中)将给定数组中的数据映射到对象,以测试一个学说实体:

给定是一个简单的实体类:

/**
 * CashPosition
 */
class CashPosition
{
    /**
     * @var integer
     */
    protected $cashPositionId;

    /**
     * @var \DateTime
     */
    protected $date;

    /**
     * @var float
     */
    protected $value;


    /**
     * Get cashPositionId
     *
     * @return integer
     */
    public function getCashPositionId()
    {
        return $this->cashPositionId;
    }

    /**
     * Set date
     *
     * @param \DateTime $date
     *
     * @return $this
     */
    public function setDate($date)
    {
        $this->date = $date;

        return $this;
    }

    /**
     * Get date
     *
     * @return \DateTime
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set value
     *
     * @param string $value
     *
     * @return $this
     */
    public function setValue($value)
    {
        $this->value = $value;

        return $this;
    }

    /**
     * Get value
     *
     * @return float
     */
    public function getValue()
    {
        return $this->value;
    }
}

我在Resources \ config \ serializer \ Entity.CashPosition.yml

下定义了序列化
MyBundle\Entity\CashPosition:
  exclusion_policy: ALL
  access_type: public_method
  properties:
    cashPositionId:
      exclude: false
      expose: true
      type: integer
      access_type: property
    date:
      exclude: false
      expose: true
      type: DateTime<'Y-m-d'>
    value:
      exclude: false
      expose: true
      type: float

试图通过序列化测试来解决这个问题:

public function testSerialization()
{
    $data = [
        'cashPositionId' => 1,
        'date'           => date('Y-m-d'),
        'value'          => 1.0,
    ];

    /* @var $serializer Serializer */
    $serializer = $this->container->get('serializer');

    $cashPosition = $serializer->fromArray($data, CashPosition::class);
    $this->assertInstanceOf(CashPosition::class, $cashPosition);
    $this->assertEquals($data, $serializer->toArray($cashPosition));
}

但测试失败,因为fromArray方法没有设置cashPositionId。我尝试了一些与访问类型不同的配置,但没有运气。我不确定这里有什么问题。

我正在使用以下版本的jms序列化程序:

jms/metadata                            1.6.0   Class/method/property metadata management in PHP
jms/parser-lib                          1.0.0   A library for easily creating recursive-descent parsers.
jms/serializer                          1.6.2   Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.
jms/serializer-bundle                   1.4.0   Allows you to easily serialize, and deserialize data of any complexity

1 个答案:

答案 0 :(得分:1)

你好我认为你错过了cashPositionId的serialized_name属性,默认情况下jms会将属性从camel case转换为snake case。

JMS Doc