3 namespace Drupal\webprofiler\Controller;
5 use Drupal\Core\Controller\ControllerBase;
6 use Drupal\Core\Database\Connection;
7 use Drupal\webprofiler\DataCollector\DatabaseDataCollector;
8 use Symfony\Component\DependencyInjection\ContainerInterface;
9 use Symfony\Component\HttpFoundation\JsonResponse;
10 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
11 use Symfony\Component\HttpKernel\Profiler\Profile;
12 use Symfony\Component\HttpKernel\Profiler\Profiler;
15 * Class DatabaseController
17 class DatabaseController extends ControllerBase {
20 * @var \Symfony\Component\HttpKernel\Profiler\Profiler
25 * @var \Drupal\Core\Database\Connection
32 public static function create(ContainerInterface $container) {
34 $container->get('profiler'),
35 $container->get('database')
40 * Constructs a new WebprofilerController.
42 * @param \Symfony\Component\HttpKernel\Profiler\Profiler $profiler
43 * @param \Drupal\Core\Database\Connection $database
45 public function __construct(Profiler $profiler, Connection $database) {
46 $this->profiler = $profiler;
47 $this->database = $database;
51 * @param Profile $profile
54 * @return JsonResponse
56 public function explainAction(Profile $profile, $qid) {
57 $query = $this->getQuery($profile, $qid);
60 $result = $this->database->query('EXPLAIN ' . $query['query'], (array) $query['args'])
61 ->fetchAllAssoc('table');
63 foreach ($result as $row) {
64 foreach ($row as $key => $value) {
65 $data[$i][$key] = $value;
70 return new JsonResponse(['data' => $data]);
74 * @param $profile ->getToken()
79 private function getQuery(Profile $profile, $qid) {
80 $this->profiler->disable();
81 $token = $profile->getToken();
83 if (!$profile = $this->profiler->loadProfile($token)) {
84 throw new NotFoundHttpException($this->t('Token @token does not exist.', ['@token' => $token]));
87 /** @var DatabaseDataCollector $databaseCollector */
88 $databaseCollector = $profile->getCollector('database');
90 $queries = $databaseCollector->getQueries();
91 $query = $queries[$qid];