Skip to content

Commit 49a6bbe

Browse files
jarstelfoxclaude
andauthored
fix: Serialize native PHP enums with name and value instead of opaque 'Object' string (#2038)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 918353c commit 49a6bbe

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

src/Serializer/AbstractSerializer.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ protected function serializeRecursively($value, int $_depth = 0)
139139
return $this->formatDate($value);
140140
}
141141

142+
if ($value instanceof \UnitEnum) {
143+
return $this->serializeValue($value);
144+
}
145+
142146
if ($this->serializeAllObjects || ($value instanceof \stdClass)) {
143147
return $this->serializeObject($value, $_depth);
144148
}
@@ -247,8 +251,13 @@ protected function serializeValue($value)
247251

248252
if ($value instanceof \UnitEnum) {
249253
$reflection = new \ReflectionObject($value);
254+
$enumValue = $reflection->getName() . '::' . $value->name;
255+
256+
if ($value instanceof \BackedEnum) {
257+
return 'Enum ' . $enumValue . '(' . $value->value . ')';
258+
}
250259

251-
return 'Enum ' . $reflection->getName() . '::' . $value->name;
260+
return 'Enum ' . $enumValue;
252261
}
253262

254263
if (\is_object($value)) {

tests/Serializer/AbstractSerializerTest.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,56 @@ public function testEnumsAreNames(): void
6666
$this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestEnum::CASE_NAME', $result);
6767
}
6868

69+
/**
70+
* @requires PHP >= 8.1
71+
*/
72+
public function testBackedEnumsIncludeValue(): void
73+
{
74+
$serializer = $this->createSerializer();
75+
$input = SerializerTestBackedEnum::CASE_NAME;
76+
$result = $this->invokeSerialization($serializer, $input);
77+
78+
$this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestBackedEnum::CASE_NAME(case_value)', $result);
79+
}
80+
81+
/**
82+
* @requires PHP >= 8.1
83+
*
84+
* @dataProvider serializeAllObjectsDataProvider
85+
*/
86+
public function testEnumsAreNotSerializedAsObjects(bool $serializeAllObjects): void
87+
{
88+
$serializer = $this->createSerializer();
89+
90+
if ($serializeAllObjects) {
91+
$serializer->setSerializeAllObjects(true);
92+
}
93+
94+
$input = SerializerTestEnum::CASE_NAME;
95+
$result = $this->invokeSerialization($serializer, $input);
96+
97+
$this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestEnum::CASE_NAME', $result);
98+
}
99+
100+
/**
101+
* @requires PHP >= 8.1
102+
*
103+
* @dataProvider serializeAllObjectsDataProvider
104+
*/
105+
public function testBackedEnumsAreNotSerializedAsObjects(bool $serializeAllObjects): void
106+
{
107+
$serializer = $this->createSerializer();
108+
109+
if ($serializeAllObjects) {
110+
$serializer->setSerializeAllObjects(true);
111+
}
112+
113+
$input = SerializerTestBackedEnum::CASE_NAME;
114+
$result = $this->invokeSerialization($serializer, $input);
115+
116+
$this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestBackedEnum::CASE_NAME(case_value)', $result);
117+
}
118+
69119
public static function objectsWithIdPropertyDataProvider(): array
70120
{
71121
return [
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Sentry\Tests\Serializer;
6+
7+
enum SerializerTestBackedEnum: string
8+
{
9+
case CASE_NAME = 'case_value';
10+
}

0 commit comments

Comments
 (0)