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

Symfony4下JMS序列化器无法输出FOSUserBundle继承属性问题求助

问题原因
  • 自定义序列化器实例未加载Symfony配置:你在命令中直接通过SerializerBuilder::create()->build()创建序列化器实例,该方式不会读取Symfony项目中jms_serializer.yml的全局配置,你配置的元数据目录完全未生效,导致所有自定义序列化规则文件都没有被加载,这也是为什么规则文件写错误语法也不报错的核心原因。
  • FOSUser基类的序列化规则文件名不符合规范:JMS序列化器要求元数据文件名必须和完整命名空间对应,你配置的FOS\UserBundle命名空间对应的规则文件应该命名为FOS.UserBundle.Model.User.yml,而不是Model.User.yml,即使配置加载生效,该规则文件也无法被匹配到。
  • 子类序列化未开启父类属性继承:默认JMS序列化器不会自动读取父类的序列化规则,需要在子类的规则配置中显式开启。
解决方案

步骤1:使用容器注入的序列化器替换自定义创建的实例

不要在命令中自己创建序列化器,而是通过Symfony依赖注入获取已经加载完全局配置的序列化器服务:

// 先在命令的构造函数中注入序列化器
use JMS\Serializer\SerializerInterface;

protected $serializer;

public function __construct(SerializerInterface $serializer)
{
    parent::__construct();
    $this->serializer = $serializer;
}

protected function execute(InputInterface $input, OutputInterface $output)
{
    $users = $this->customerRepository->findAll();
    $context = new SerializationContext();
    $context->setGroups(['export']);
    // 直接使用注入的序列化器
    $json = $this->serializer->serialize($users, 'json', $context);
    // 后续逻辑
}

步骤2:修正FOSUser基类规则文件名

将serializer/Model.User.yml重命名为serializer/FOS.UserBundle.Model.User.yml,确保和完整命名空间匹配。

步骤3:在子类序列化规则中开启父类属性继承

修改serializer/App.Client.common.Entities.User.yml,添加inherit_properties配置:

App\Client\common\Entities\User:
    exclusion_policy: ALL
    inherit_properties: true # 新增这行,开启父类规则继承
    properties:
        surname:
            expose: true
            groups: [export]

步骤4:验证配置生效

修改完成后执行php bin/console cache:clear清空缓存,此时如果序列化规则文件存在语法错误会抛出异常,即可确认配置已经被正常加载。

内容的提问来源于stack exchange,提问作者tbarbot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:03