123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?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\ConversionException;
- use Doctrine\DBAL\Types\Type;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\Response;
- use Symfony\Component\HttpKernel\DataCollector\DataCollector;
- /**
- * 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;
- if (null === $query['params']) {
- $query['params'] = array();
- }
- if (!\is_array($query['params'])) {
- $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();
- try {
- $param = $type->convertToDatabaseValue($param, $this->registry->getConnection($connectionName)->getDatabasePlatform());
- } catch (\TypeError $e) {
- // Error thrown while processing params, query is not explainable.
- $query['explainable'] = false;
- } catch (ConversionException $e) {
- $query['explainable'] = false;
- }
- }
- }
- list($query['params'][$j], $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);
- }
- }
|