0

我正在使用JMS/Serialzier 库

我已经设置了一个事件订阅者,它监听Events::PRE_SERIALIZE然后我将Price具有该属性currency的类的所有对象实例转换amount为不同的货币。

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

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

然而现在,在我的应用程序中,我有一个极端情况,即属于一个容器对象的一个​​价格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 回答