如何为多个PHP后台枚举自动实现JMS序列化与反序列化?
背景
我使用JMS序列化库,需要对以PHP后台枚举形式内部存储的数据进行序列化/反序列化操作。
问题所在
我通过SubscribingHandlerInterface接口找到了一个解决方案,但希望简化流程,尽可能移除需要为每个新枚举创建的样板类。
当前可运行待简化的代码
- 示例枚举:
<?php namespace App\Enum; enum MyEnum: string { case Hello = 'hello'; case World = 'world'; }
- 以下抽象类用于减少最终类(即我希望移除的类)的冗余代码:
<?php namespace App\Serializer; use JMS\Serializer\GraphNavigator; use JMS\Serializer\Handler\SubscribingHandlerInterface; use JMS\Serializer\JsonDeserializationVisitor; use JMS\Serializer\SerializationContext; use JMS\Serializer\Visitor\SerializationVisitorInterface; use LogicException; abstract class AbstractEnumSerializer implements SubscribingHandlerInterface { public static function getEnumClass(): string { throw new LogicException("Please implement this"); } public static function getSubscribingMethods(): array { return [ [ 'direction' => GraphNavigator::DIRECTION_DESERIALIZATION, 'format' => 'json', 'type' => static::getEnumClass(), 'method' => 'deserializeFromJSON', ], [ 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, 'format' => 'json', 'type' => static::getEnumClass(), 'method' => 'serializeToJSON', ], ]; } public function deserializeFromJSON(JsonDeserializationVisitor $visitor, $data, array $type) { return static::getEnumClass()::tryFrom($data); } public function serializeToJSON( SerializationVisitorInterface $visitor, $enum, array $type, SerializationContext $context ): string { return $enum->value; } }
- 以下是我希望通过自动生成/注册方式移除的类:它为上述示例枚举实现了序列化/反序列化,但属于样板代码,每个新枚举都需要编写:
<?php namespace App\Serializer; use App\Enum\MyEnum; class MyEnumSerializer extends AbstractEnumSerializer { public static function getEnumClass(): string { return MyEnum::class; } }
问题
假设有大量PHP后台枚举需要进行序列化/反序列化操作,能否通过自动生成/注册的方式避免为每个枚举编写MyEnumSerializer类?
核心目标是简化新增后台枚举的操作,同时自动为其实现JMS序列化与反序列化。
内容的提问来源于stack exchange,提问作者yolenoyer
相关产品推荐
相关产品推荐

