diff --git a/src/Symfony/Bundle/DoctrineMongoDBBundle/Logger/DoctrineMongoDBLogger.php b/src/Symfony/Bundle/DoctrineMongoDBBundle/Logger/DoctrineMongoDBLogger.php index 4216a5ae7d..5e4afb1c0d 100644 --- a/src/Symfony/Bundle/DoctrineMongoDBBundle/Logger/DoctrineMongoDBLogger.php +++ b/src/Symfony/Bundle/DoctrineMongoDBBundle/Logger/DoctrineMongoDBLogger.php @@ -26,13 +26,7 @@ class DoctrineMongoDBLogger ++$this->nbQueries; if (null !== $this->logger) { - switch (key($query)) { - case 'batchInsert': - $this->logger->info(Yaml::dump(array('data' => '[omitted]') + $query, 0)); - break; - default: - $this->logger->info(Yaml::dump($query, 0)); - } + $this->logger->info(static::formatQuery($query)); } } @@ -40,4 +34,54 @@ class DoctrineMongoDBLogger { return $this->nbQueries; } + + /** + * Formats the supplied query array recursively. + * + * @param array $query All or part of a query array + * + * @return string A serialized object for the log + */ + static protected function formatQuery(array $query) + { + $parts = array(); + + $array = true; + foreach ($query as $key => $value) { + if (!is_numeric($key)) { + $array = false; + } + + if (is_scalar($value)) { + $formatted = json_encode($value); + } elseif (is_array($value)) { + $formatted = static::formatQuery($value); + } elseif ($value instanceof \MongoId) { + $formatted = 'ObjectId('.json_encode((string) $value).')'; + } elseif ($value instanceof \MongoDate) { + $formatted = 'new Date('.date('r', $value->sec).')'; + } elseif ($value instanceof \MongoRegex) { + $formatted = 'new RegExp('.json_encode($value->regex).', '.json_encode($value->flags).')'; + } else { + $formatted = (string) $value; + } + + $parts[json_encode($key)] = $formatted; + } + + if (0 == count($parts)) { + return $array ? '[ ]' : '{ }'; + } + + if ($array) { + return '[ '.implode(', ', $parts).' ]'; + } else { + $mapper = function($key, $value) + { + return $key.': '.$value; + }; + + return '{ '.implode(', ', array_map($mapper, array_keys($parts), array_values($parts))).' }'; + } + } }