4

我使用 JMS Serializer Bundle 和 Symfony2。我正在使用虚拟属性。目前,我使用 SerializedName 注释设置属性的名称。

 /**
 * @JMS\VirtualProperty()
 * @JMS\SerializedName("SOME_NAME")
 */
public function getSomething()
{
    return $this->something
}

是否可以在函数内部动态设置序列化名称?或者是否可以使用 Post/Pre 序列化事件动态影响名称?

谢谢!

4

3 回答 3

0

我认为您不能直接执行此操作,但您可以通过拥有多个虚拟属性来完成类似的操作,每个虚拟属性对应一个可能的名称。如果名称与特定实体无关,则让方法返回 null,并在 JMS 配置中禁用 null 序列化。

于 2014-11-21T20:09:18.320 回答
0

实体

/**
 * @JMS\VirtualProperty("something", exp="context", options={
 *     @JMS\Expose,
 * })
 */
class SomeEntity
{
}

事件监听器

abstract class AbstractEntitySubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            [
                'event'    => Events::POST_SERIALIZE,
                'method'   => 'onPostSerialize',
                'class'    => static::getClassName(),
                'format'   => JsonEncoder::FORMAT,
                'priority' => 0,
            ],
        ];
    }

    public function onPostSerialize(ObjectEvent $event): void
    {
        foreach ($this->getMethodNames() as $methodName) {
            $visitor  = $event->getVisitor();
            $metadata = new VirtualPropertyMetadata(static::getClassName(), $methodName);

            if ($visitor->hasData($metadata->name)) {
                $value = $this->{$methodName}($event->getObject());
                $visitor->visitProperty(
                    new StaticPropertyMetadata(static::getClassName(), $metadata->name, $value),
                    $value
                );
            }
        }
    }

    abstract protected static function getClassName(): string;

    abstract protected function getMethodNames(): array;
}

...

class SomeEntitySubscriber extends AbstractEntitySubscriber
{
    protected static function getClassName(): string
    {
        return SomeEntity::class;
    }

    protected function getMethodNames(): array
    {
        return ['getSomething'];
    }

    protected function getSomething(SomeEntity $someEntity)
    {
        return 'some text';
    }
}
于 2020-01-20T12:58:56.543 回答
0

在您序列化对象的那一刻,请执行以下操作:

$this->serializer = SerializerBuilder::create()->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy())->build();

$json = $this->serializer->serialize($object, 'json');
dump($json);
于 2017-10-30T09:45:45.220 回答