* (c) Doctrine Project, Benjamin Eberlei * * 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 */ 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, )); } }