diff --git a/src/Serializer/AbstractSerializer.php b/src/Serializer/AbstractSerializer.php index 9e6312325..f5c119942 100644 --- a/src/Serializer/AbstractSerializer.php +++ b/src/Serializer/AbstractSerializer.php @@ -139,6 +139,10 @@ protected function serializeRecursively($value, int $_depth = 0) return $this->formatDate($value); } + if ($value instanceof \UnitEnum) { + return $this->serializeValue($value); + } + if ($this->serializeAllObjects || ($value instanceof \stdClass)) { return $this->serializeObject($value, $_depth); } @@ -247,8 +251,13 @@ protected function serializeValue($value) if ($value instanceof \UnitEnum) { $reflection = new \ReflectionObject($value); + $enumValue = $reflection->getName() . '::' . $value->name; + + if ($value instanceof \BackedEnum) { + return 'Enum ' . $enumValue . '(' . $value->value . ')'; + } - return 'Enum ' . $reflection->getName() . '::' . $value->name; + return 'Enum ' . $enumValue; } if (\is_object($value)) { diff --git a/tests/Serializer/AbstractSerializerTest.php b/tests/Serializer/AbstractSerializerTest.php index 89932ba1a..e3fda32f8 100644 --- a/tests/Serializer/AbstractSerializerTest.php +++ b/tests/Serializer/AbstractSerializerTest.php @@ -66,6 +66,68 @@ public function testEnumsAreNames(): void $this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestEnum::CASE_NAME', $result); } + /** + * @requires PHP >= 8.1 + */ + public function testBackedEnumsIncludeValue(): void + { + $serializer = $this->createSerializer(); + $input = SerializerTestBackedEnum::CASE_NAME; + $result = $this->invokeSerialization($serializer, $input); + + $this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestBackedEnum::CASE_NAME(case_value)', $result); + } + + /** + * @requires PHP >= 8.1 + */ + public function testUnitEnumsShowName(): void + { + $serializer = $this->createSerializer(); + $input = SerializerTestEnum::CASE_NAME; + $result = $this->invokeSerialization($serializer, $input); + + $this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestEnum::CASE_NAME', $result); + } + + /** + * @requires PHP >= 8.1 + * + * @dataProvider serializeAllObjectsDataProvider + */ + public function testEnumsAreNotSerializedAsObjects(bool $serializeAllObjects): void + { + $serializer = $this->createSerializer(); + + if ($serializeAllObjects) { + $serializer->setSerializeAllObjects(true); + } + + $input = SerializerTestEnum::CASE_NAME; + $result = $this->invokeSerialization($serializer, $input); + + $this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestEnum::CASE_NAME', $result); + } + + /** + * @requires PHP >= 8.1 + * + * @dataProvider serializeAllObjectsDataProvider + */ + public function testBackedEnumsAreNotSerializedAsObjects(bool $serializeAllObjects): void + { + $serializer = $this->createSerializer(); + + if ($serializeAllObjects) { + $serializer->setSerializeAllObjects(true); + } + + $input = SerializerTestBackedEnum::CASE_NAME; + $result = $this->invokeSerialization($serializer, $input); + + $this->assertSame('Enum Sentry\Tests\Serializer\SerializerTestBackedEnum::CASE_NAME(case_value)', $result); + } + public static function objectsWithIdPropertyDataProvider(): array { return [ diff --git a/tests/Serializer/SerializerTestBackedEnum.php b/tests/Serializer/SerializerTestBackedEnum.php new file mode 100644 index 000000000..7a4ee78ac --- /dev/null +++ b/tests/Serializer/SerializerTestBackedEnum.php @@ -0,0 +1,10 @@ +