You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:48:15