Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Commit

Permalink
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 8 deletions.
23 changes: 15 additions & 8 deletions src/Formatter/Base.php
Expand Up @@ -11,6 +11,7 @@

use DateTime;
use Traversable;
use Zend\Stdlib\ErrorHandler;

class Base implements FormatterInterface
{
Expand Down Expand Up @@ -75,23 +76,29 @@ protected function normalize($value)
return $value;
}

// better readable JSON
static $jsonFlags;
if ($jsonFlags === null) {
$jsonFlags = 0;
$jsonFlags |= defined('JSON_UNESCAPED_SLASHES') ? JSON_UNESCAPED_SLASHES : 0;
$jsonFlags |= defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE : 0;
}

ErrorHandler::start();
if ($value instanceof DateTime) {
$value = $value->format($this->getDateTimeFormat());
} elseif (is_array($value) || $value instanceof Traversable) {
if ($value instanceof Traversable) {
$value = iterator_to_array($value);
}
foreach ($value as $key => $subvalue) {
$value[$key] = $this->normalize($subvalue);
}
$value = json_encode($value);
} elseif ($value instanceof Traversable) {
$value = json_encode(iterator_to_array($value), $jsonFlags);
} elseif (is_array($value)) {
$value = json_encode($value, $jsonFlags);
} elseif (is_object($value) && !method_exists($value, '__toString')) {
$value = sprintf('object(%s) %s', get_class($value), json_encode($value));
} elseif (is_resource($value)) {
$value = sprintf('resource(%s)', get_resource_type($value));
} elseif (!is_object($value)) {
$value = gettype($value);
}
ErrorHandler::stop();

return (string) $value;
}
Expand Down
28 changes: 28 additions & 0 deletions test/Formatter/BaseTest.php
Expand Up @@ -121,4 +121,32 @@ public function testFormatAllTypes()

$this->assertEquals($outputExpected, $formatter->format($event));
}

public function testFormatNoInfiniteLoopOnSelfReferencingArrayValues()
{
$datetime = new DateTime();
$formatter = new BaseFormatter();

$selfRefArr = array();
$selfRefArr['selfRefArr'] = & $selfRefArr;

$event = array(
'timestamp' => $datetime,
'priority' => 1,
'message' => 'tottakai',
'extra' => array(
'selfRefArr' => $selfRefArr,
),
);
$outputExpected = array(
'timestamp' => $datetime->format($formatter->getDateTimeFormat()),
'priority' => 1,
'message' => 'tottakai',
'extra' => array(
'selfRefArr' => '{"selfRefArr":{"selfRefArr":null}}',
),
);

$this->assertEquals($outputExpected, $formatter->format($event));
}
}

0 comments on commit a6fa26b

Please sign in to comment.