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
相关产品推荐
相关产品推荐

