Просмотр исходного кода

Fix json formatter handling of incomplete classes, fixes #1834

Jordi Boggiano 1 год назад
Родитель
Сommit
884aa47a05

+ 4 - 0
src/Monolog/Formatter/JsonFormatter.php

@@ -192,6 +192,10 @@ class JsonFormatter extends NormalizerFormatter
                 return $data;
             }
 
+            if (\get_class($data) === '__PHP_Incomplete_Class') {
+                return new \ArrayObject($data);
+            }
+
             if (method_exists($data, '__toString')) {
                 return $data->__toString();
             }

+ 12 - 0
tests/Monolog/Formatter/JsonFormatterTest.php

@@ -297,6 +297,18 @@ class JsonFormatterTest extends TestCase
         $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']);
     }
 
+    public function testCanNormalizeIncompleteObject(): void
+    {
+        $serialized = "O:17:\"Monolog\TestClass\":1:{s:23:\"\x00Monolog\TestClass\x00name\";s:4:\"test\";}";
+        $object = unserialize($serialized);
+
+        $formatter = new JsonFormatter();
+        $record = ['context' => ['object' => $object]];
+        $result = $formatter->format($record);
+
+        self::assertSame('{"context":{"object":{"__PHP_Incomplete_Class_Name":"Monolog\\\\TestClass"}}}'."\n", $result);
+    }
+
     public function testEmptyContextAndExtraFieldsCanBeIgnored()
     {
         $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, true, true);