我有一个聚合根 - 产品 - 几乎没有字段,其中一些是像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事件上编写监听器?
答案 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;