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

PHP 8项目中JMS Serializer注解失效问题求助

解决JMS Serializer注解在PHP 8项目中不生效的问题

问题原因

JMS Serializer 3.x版本依赖Doctrine注解库解析注解,默认环境下若未安装该依赖或未正确配置注解驱动,注解会被直接忽略。同时,PHP 8的原生注解系统并未被JMS Serializer默认启用,需手动配置注解元数据加载器才能让注解生效。

解决方案

1. 安装Doctrine注解依赖

首先通过Composer安装JMS Serializer解析注解的必要依赖:

composer require doctrine/annotations

2. 配置SerializerBuilder启用注解驱动

修改test.php中的序列化器构建逻辑,添加注解驱动配置:

<?php
require_once __DIR__.'/vendor/autoload.php';

use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Expose;
use JMS\Serializer\SerializerBuilder;
use Doctrine\Common\Annotations\AnnotationReader;
use JMS\Serializer\Metadata\Driver\AnnotationDriver;

/** @ExclusionPolicy("all") */
class Test {
    /** @Expose */
    private string $name;
    private int $value;

    public function getName(): string {
        return $this->name;
    }
    public function setName(string $name): void {
        $this->name = $name;
    }
    public function getValue(): int {
        return $this->value;
    }
    public function setValue(int $value): void {
        $this->value = $value;
    }
}

$test = new Test();
$test->setName("John Doe");
$test->setValue(100);

// 配置注解驱动并构建序列化器
$serializer = SerializerBuilder::create()
    ->setMetadataDriverImpl(AnnotationDriver::create(new AnnotationReader()))
    ->build();

echo $serializer->serialize($test, 'json');

3. 验证结果

执行修改后的代码,输出将符合预期:

{"name":"John Doe"}

额外说明

  • 若需使用PHP 8原生注解,JMS Serializer 3.20+版本提供支持,需额外安装jms/serializer-php8-annotation-adapter依赖,并配置对应注解驱动。
  • 确保注解的命名空间已正确引入,避免因类名冲突导致注解无法识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:32:12