Viewing file: DoctrineDataCollector.php (4.56 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */
namespace Symfony\Bridge\Doctrine\DataCollector;
use Doctrine\Common\Persistence\ManagerRegistry; use Doctrine\DBAL\Logging\DebugStack; use Doctrine\DBAL\Types\Type; use Symfony\Component\HttpKernel\DataCollector\DataCollector; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response;
/** * DoctrineDataCollector. * * @author Fabien Potencier <fabien@symfony.com> */ class DoctrineDataCollector extends DataCollector { private $registry; private $connections; private $managers; private $loggers = array();
public function __construct(ManagerRegistry $registry) { $this->registry = $registry; $this->connections = $registry->getConnectionNames(); $this->managers = $registry->getManagerNames(); }
/** * Adds the stack logger for a connection. * * @param string $name * @param DebugStack $logger */ public function addLogger($name, DebugStack $logger) { $this->loggers[$name] = $logger; }
/** * {@inheritdoc} */ public function collect(Request $request, Response $response, \Exception $exception = null) { $queries = array(); foreach ($this->loggers as $name => $logger) { $queries[$name] = $this->sanitizeQueries($name, $logger->queries); }
$this->data = array( 'queries' => $queries, 'connections' => $this->connections, 'managers' => $this->managers, ); }
public function getManagers() { return $this->data['managers']; }
public function getConnections() { return $this->data['connections']; }
public function getQueryCount() { return array_sum(array_map('count', $this->data['queries'])); }
public function getQueries() { return $this->data['queries']; }
public function getTime() { $time = 0; foreach ($this->data['queries'] as $queries) { foreach ($queries as $query) { $time += $query['executionMS']; } }
return $time; }
/** * {@inheritdoc} */ public function getName() { return 'db'; }
private function sanitizeQueries($connectionName, $queries) { foreach ($queries as $i => $query) { $queries[$i] = $this->sanitizeQuery($connectionName, $query); }
return $queries; }
private function sanitizeQuery($connectionName, $query) { $query['explainable'] = true; $query['params'] = (array) $query['params']; foreach ($query['params'] as $j => &$param) { if (isset($query['types'][$j])) { // Transform the param according to the type $type = $query['types'][$j]; if (is_string($type)) { $type = Type::getType($type); } if ($type instanceof Type) { $query['types'][$j] = $type->getBindingType(); $param = $type->convertToDatabaseValue($param, $this->registry->getConnection($connectionName)->getDatabasePlatform()); } }
list($param, $explainable) = $this->sanitizeParam($param); if (!$explainable) { $query['explainable'] = false; } }
return $query; }
/** * Sanitizes a param. * * The return value is an array with the sanitized value and a boolean * indicating if the original value was kept (allowing to use the sanitized * value to explain the query). * * @param mixed $var * * @return array */ private function sanitizeParam($var) { if (is_object($var)) { return array(sprintf('Object(%s)', get_class($var)), false); }
if (is_array($var)) { $a = array(); $original = true; foreach ($var as $k => $v) { list($value, $orig) = $this->sanitizeParam($v); $original = $original && $orig; $a[$k] = $value; }
return array($a, $original); }
if (is_resource($var)) { return array(sprintf('Resource(%s)', get_resource_type($var)), false); }
return array($var, true); } }
|