序列化嵌套对象私有字段

时间:2017-08-24 16:49:02

标签: php symfony serialization jmsserializerbundle

我有一个聚合根 - 产品 - 几乎没有字段,其中一些是像Price这样的对象。它看起来像(当然它是简化的):

.background-fixed .panel-image {
    
   background-attachment: fixed;
}

此聚合根目录不包含" getPrice"方法,在域名中不需要。

问题: 我需要序列化这个聚合,但我希望用这种格式:

Product.json

Product
{
    private $price;

    public function __construct(Price $price)
    {
       $this->price = $price;
    }
}


Price
{

    private $currency;
    private $amount;

    public function __construct($currency, $amount)
    {
       $this->currency = $currency;
       $this->amount= $amount;
    }
}

我一直在尝试使用JMSSerializer,但无法从配置中获得它。例如不起作用

Product.yml

{    
    "priceCurrency": "GBP",
    "priceAmount": 100 
}

据我所知,这是因为" exp"部分由Symfony表达语言使用,据我所知,它不支持以任何其他方式从私有字段获取值,然后通过他们的方法。我也知道JMSSerializer本身支持它。我不必拥有现场" getPrice"序列化"价格"领域。

问题:有没有办法通过配置实现我想要的功能,还是必须在post_serialize事件上编写监听器?

1 个答案:

答案 0 :(得分:1)

使用类似的东西:

<?php

class Property
{
    protected $reflection;
    protected $obj;

    public function __construct($obj)
    {
        $this->obj = $obj;
        $this->reflection = new ReflectionObject($obj);
    }

    public function set($name, $value)
    {
        $this->getProperty($name)->setValue($this->obj, $value);
    }

    public function get($name)
    {
        return $this->getProperty($name)->getValue($this->obj);
    }

    protected function getProperty($name)
    {
        $property = $this->reflection->getProperty($name);
        $property->setAccessible(true);
        return $property;
    }
}

// example
class Foo
{
    protected $bar = 123;

    public function getBar()
    {
        return $this->bar;
    }
}

$foo = new Foo();
echo 'original: '.$foo->getBar().PHP_EOL;

$prop = new Property($foo);
echo 'reflection - before changes: '.$prop->get('bar').PHP_EOL;

$prop->set('bar', 'abc');

echo 'after changes: '.$foo->getBar().PHP_EOL;