Version 1
[yaffs-website] / web / modules / contrib / devel / webprofiler / src / Controller / DatabaseController.php
1 <?php
2
3 namespace Drupal\webprofiler\Controller;
4
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;
13
14 /**
15  * Class DatabaseController
16  */
17 class DatabaseController extends ControllerBase {
18
19   /**
20    * @var \Symfony\Component\HttpKernel\Profiler\Profiler
21    */
22   private $profiler;
23
24   /**
25    * @var \Drupal\Core\Database\Connection
26    */
27   private $database;
28
29   /**
30    * {@inheritdoc}
31    */
32   public static function create(ContainerInterface $container) {
33     return new static(
34       $container->get('profiler'),
35       $container->get('database')
36     );
37   }
38
39   /**
40    * Constructs a new WebprofilerController.
41    *
42    * @param \Symfony\Component\HttpKernel\Profiler\Profiler $profiler
43    * @param \Drupal\Core\Database\Connection $database
44    */
45   public function __construct(Profiler $profiler, Connection $database) {
46     $this->profiler = $profiler;
47     $this->database = $database;
48   }
49
50   /**
51    * @param Profile $profile
52    * @param int $qid
53    *
54    * @return JsonResponse
55    */
56   public function explainAction(Profile $profile, $qid) {
57     $query = $this->getQuery($profile, $qid);
58
59     $data = [];
60     $result = $this->database->query('EXPLAIN ' . $query['query'], (array) $query['args'])
61       ->fetchAllAssoc('table');
62     $i = 1;
63     foreach ($result as $row) {
64       foreach ($row as $key => $value) {
65         $data[$i][$key] = $value;
66       }
67       $i++;
68     }
69
70     return new JsonResponse(['data' => $data]);
71   }
72
73   /**
74    * @param $profile ->getToken()
75    * @param int $qid
76    *
77    * @return array
78    */
79   private function getQuery(Profile $profile, $qid) {
80     $this->profiler->disable();
81     $token = $profile->getToken();
82
83     if (!$profile = $this->profiler->loadProfile($token)) {
84       throw new NotFoundHttpException($this->t('Token @token does not exist.', ['@token' => $token]));
85     }
86
87     /** @var DatabaseDataCollector $databaseCollector */
88     $databaseCollector = $profile->getCollector('database');
89
90     $queries = $databaseCollector->getQueries();
91     $query = $queries[$qid];
92
93     return $query;
94   }
95 }