2017-08-24 8 views
1

私は1つを持っています集計ルート - 製品 - フィールドが少なく、そのうちのいくつかはPriceのようなオブジェクトです。それは(もちろん、それが簡略化された)のようになります。ネストされたオブジェクトのプライベートフィールドをシリアライズ

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; 
    } 
} 

この集約ルートは「getPrice」方法、それはドメインでは不要だが含まれていません。

問題: 私はこの集計をシリアル化する必要がありますが、私はこの形式でそれを持ってしたいと思います:

Product.json

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

私はJMSSerializerにしようとしてきたことができますが、本当に設定からそれを得ていない。たとえばのためのこれはを動作しません:

Product.yml

Namespace\Product: 
    virtual_properties: 
    getAmount: 
     exp: object.price.amount 
     serialized_name: priceAmount 
     type: integer 
    getCurrency: 
     exp: object.price.currency 
     serialized_name: priceCurrency 
     type: string 

私はそれが「EXP」の部分はsymfonyの表現言語で、何から使用されていることを、事実によるということを理解します私は、他の方法でプライベートフィールドから値を取得することをサポートしていないことを知っています。私はまた、JMSSerializer自体がそれをサポートしていることも知っています。フィールド "getPrice"を持っていなくても "price"フィールドをシリアライズすることができます。

質問:私が設定から欲しいものを達成する方法はありますか?または、post_serializeイベントでリスナーを作成する必要がありますか?

+0

なぜあなたは仮想プロパティを使用していて、ちょうどプロパティ自体に 'serialized_name'を設定していませんか? –

+0

hmm?それが私を助けるだろうか? serialized_nameはシリアライズされたフィールドの名前にすぎず、名前を設定するのではなく値を取得するのに問題があります。 – mmmm

+0

多分、私はその問題が何かを誤解していました...私は、JMSがプライベートフィールド値を得るためにリフレクションを使用したと考えました。それはあなたが問題を抱えているのでしょうか?それとも、関連付けられたオブジェクトから特定の値を取得しようとしているという事実ですか? –

答えて

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; 
関連する問題