69 lines
2.1 KiB
PHP
69 lines
2.1 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Doctrine Bundle
|
|
*
|
|
* The code was originally distributed inside the Symfony framework.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
* (c) Doctrine Project, Benjamin Eberlei <kontakt@beberlei.de>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Doctrine\Bundle\DoctrineBundle\Controller;
|
|
|
|
use Symfony\Component\DependencyInjection\ContainerAware;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
/**
|
|
* ProfilerController.
|
|
*
|
|
* @author Christophe Coevoet <stof@notk.org>
|
|
*/
|
|
class ProfilerController extends ContainerAware
|
|
{
|
|
/**
|
|
* Renders the profiler panel for the given token.
|
|
*
|
|
* @param string $token The profiler token
|
|
* @param string $connectionName
|
|
* @param integer $query
|
|
*
|
|
* @return Response A Response instance
|
|
*/
|
|
public function explainAction($token, $connectionName, $query)
|
|
{
|
|
/** @var $profiler \Symfony\Component\HttpKernel\Profiler\Profiler */
|
|
$profiler = $this->container->get('profiler');
|
|
$profiler->disable();
|
|
|
|
$profile = $profiler->loadProfile($token);
|
|
$queries = $profile->getCollector('db')->getQueries();
|
|
|
|
if (!isset($queries[$connectionName][$query])) {
|
|
return new Response('This query does not exist.');
|
|
}
|
|
|
|
$query = $queries[$connectionName][$query];
|
|
if (!$query['explainable']) {
|
|
return new Response('This query cannot be explained.');
|
|
}
|
|
|
|
/** @var $connection \Doctrine\DBAL\Connection */
|
|
$connection = $this->container->get('doctrine')->getConnection($connectionName);
|
|
try {
|
|
$results = $connection->executeQuery('EXPLAIN '.$query['sql'], $query['params'], $query['types'])
|
|
->fetchAll(\PDO::FETCH_ASSOC);
|
|
} catch (\Exception $e) {
|
|
return new Response('This query cannot be explained.');
|
|
}
|
|
|
|
return $this->container->get('templating')->renderResponse('DoctrineBundle:Collector:explain.html.twig', array(
|
|
'data' => $results,
|
|
'query' => $query,
|
|
));
|
|
}
|
|
}
|