Parcourir la source

ZF-11161: allow objects implementing __toString in XML log format

- Added test for objects with __toString method when serializing an
  event for XML log format

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@24236 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew il y a 14 ans
Parent
commit
787e5156d0
2 fichiers modifiés avec 34 ajouts et 3 suppressions
  1. 5 2
      library/Zend/Log/Formatter/Xml.php
  2. 29 1
      tests/Zend/Log/Formatter/XmlTest.php

+ 5 - 2
library/Zend/Log/Formatter/Xml.php

@@ -146,7 +146,10 @@ class Zend_Log_Formatter_Xml extends Zend_Log_Formatter_Abstract
         $elt = $dom->appendChild(new DOMElement($this->_rootElement));
 
         foreach ($dataToInsert as $key => $value) {
-            if(empty($value) || is_scalar($value)) {
+            if (empty($value) 
+                || is_scalar($value) 
+                || (is_object($value) && method_exists($value,'__toString'))
+            ) {
                 if($key == "message") {
                     $value = htmlspecialchars($value, ENT_COMPAT, $enc);
                 }
@@ -159,4 +162,4 @@ class Zend_Log_Formatter_Xml extends Zend_Log_Formatter_Abstract
 
         return $xml . PHP_EOL;
     }
-}
+}

+ 29 - 1
tests/Zend/Log/Formatter/XmlTest.php

@@ -159,8 +159,36 @@ class Zend_Log_Formatter_XmlTest extends PHPUnit_Framework_TestCase
         $this->assertContains($expected, $output);
     }
     
+    /**
+     * @group ZF-11161
+     */
+    public function testObjectsWithStringSerializationAreIncludedInFormattedString()
+    {
+        $options = array(
+            'rootElement' => 'log'
+        );
+        $event = array(
+            'message' => 'tottakai',
+            'priority' => 4,
+            'context' => array('test'=>'one'),
+            'reference' => new Zend_Log_Formatter_XmlTest_SerializableObject()
+        );
+        $expected = '<log><message>tottakai</message><priority>4</priority><reference>Zend_Log_Formatter_XmlTest_SerializableObject</reference></log>';
+
+        $formatter = new Zend_Log_Formatter_Xml($options);
+        $output = $formatter->format($event);
+        $this->assertContains($expected, $output);
+    }
+}
+
+class Zend_Log_Formatter_XmlTest_SerializableObject
+{
+    public function __toString()
+    {
+        return __CLASS__;
+    }
 }
 
 if (PHPUnit_MAIN_METHOD == 'Zend_Log_Formatter_XmlTest::main') {
     Zend_Log_Formatter_XmlTest::main();
-}
+}