Procházet zdrojové kódy

#673 Fix fatal error while normalizing with __toString method which may throw an exception

Anton Sergeyev před 10 roky
rodič
revize
f19d9ce9a1

+ 1 - 1
src/Monolog/Formatter/NormalizerFormatter.php

@@ -96,7 +96,7 @@ class NormalizerFormatter implements FormatterInterface
 
             // non-serializable objects that implement __toString stringified
             if (method_exists($data, '__toString') && !$data instanceof \JsonSerializable) {
-                $value = (string) $data;
+                $value = $data->__toString();
             } else {
                 // the rest is json-serialized in some way
                 $value = $this->toJson($data, true);

+ 17 - 0
tests/Monolog/Formatter/NormalizerFormatterTest.php

@@ -78,6 +78,15 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
         ), $formatted);
     }
 
+    public function testFormatToStringExceptionHandle()
+    {
+        $formatter = new NormalizerFormatter('Y-m-d');
+        $this->setExpectedException('RuntimeException', 'Could not convert to string');
+        $formatter->format(array(
+            'myObject' => new TestToStringError(),
+        ));
+    }
+
     public function testBatchFormat()
     {
         $formatter = new NormalizerFormatter('Y-m-d');
@@ -268,3 +277,11 @@ class TestStreamFoo
         return $this->foo . ' - ' . (string) stream_get_contents($this->resource);
     }
 }
+
+class TestToStringError
+{
+    public function __toString()
+    {
+        throw new \RuntimeException('Could not convert to string');
+    }
+}