0

JMS/Serialzier ライブラリを使用しています。

リッスンする Event-Subscriber をセットアップし、プロパティを持つEvents::PRE_SERIALIZEクラスのすべてのオブジェクト インスタンスを異なる通貨に変換します。Pricecurrencyamount

public function onPreSerialize(PreSerializeEvent $event)
{
    $object = $event->getObject();
    $class = get_class($object);

    switch ($class) {
        case Price::class:
            return $this->currencyService->convertPrice($object);
    }
}

しかし今、私のアプリケーションでは、1 つのコンテナー オブジェクトに属する 1 つの価格EdgeCaseをまったく変換する必要がないというエッジ ケースがあります。

use JMS\Serializer\Annotation\Type;
class EdgeCase {

    /**
     * @Type("Kopernikus\Price")
     * @var Price
     */
    private $price; // this one instance should not be handled by the event subscriber
}

ただし、元の状態を維持する必要があります。それでも、オブジェクトがどこから来たのかを区別できないようです。

Priceどのオブジェクトをいつ変換するかを設定できるようにしたいと考えています。

4

1 に答える 1

0

手っ取り早い解決策として、私は をStaticPrice拡張するクラスを作成しPrice、そのエッジ ケースの Price オブジェクトのインスタンス化を変更しました。

サブスクライバーにさらにチェックを追加したので、関連するサブスクライバーは次のようになります。

    switch ($class) {
        case Price::class:
            if ($object instanceof StaticPrice) {
                 break;
            }
            return $this->currencyService->convertPrice($object);
    }

しかし、オブジェクト レベルでハードコードされた方法でこれを解決するのは間違っていると感じます。そして、価格オブジェクトを作成するロジックを変更する必要があります。しかし、それは今のところ機能します。

于 2016-01-28T14:04:50.673 に答える