Вход Регистрация
Файл: symfony-2.7/src/Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php
Строк: 181
<?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 SymfonyBridgeDoctrineDataCollector;

use 
DoctrineCommonPersistenceManagerRegistry;
use 
DoctrineDBALLoggingDebugStack;
use 
DoctrineDBALTypesType;
use 
SymfonyComponentHttpKernelDataCollectorDataCollector;
use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentHttpFoundationResponse;

/**
 * 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($nameDebugStack $logger)
    {
        
$this->loggers[$name] = $logger;
    }

    
/**
     * {@inheritdoc}
     */
    
public function collect(Request $requestResponse $responseException $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(
$vartrue);
    }
}
Онлайн: 1
Реклама