Version 1
[yaffs-website] / web / modules / contrib / devel / webprofiler / src / Controller / DashboardController.php
diff --git a/web/modules/contrib/devel/webprofiler/src/Controller/DashboardController.php b/web/modules/contrib/devel/webprofiler/src/Controller/DashboardController.php
new file mode 100644 (file)
index 0000000..2b1d93e
--- /dev/null
@@ -0,0 +1,243 @@
+<?php
+
+namespace Drupal\webprofiler\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Datetime\DateFormatter;
+use Drupal\Core\Url;
+use Drupal\webprofiler\DrupalDataCollectorInterface;
+use Drupal\webprofiler\Profiler\ProfilerStorageManager;
+use Drupal\webprofiler\Profiler\TemplateManager;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Drupal\webprofiler\Profiler\Profiler;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpKernel\Profiler\Profile;
+use Symfony\Component\Routing\RouterInterface;
+
+/**
+ * Class DashboardController
+ */
+class DashboardController extends ControllerBase {
+
+  /**
+   * @var \Drupal\webprofiler\Profiler\Profiler
+   */
+  private $profiler;
+
+  /**
+   * @var \Symfony\Cmf\Component\Routing\ChainRouter
+   */
+  private $router;
+
+  /**
+   * @var \Drupal\webprofiler\Profiler\TemplateManager
+   */
+  private $templateManager;
+
+  /**
+   * @var \Drupal\Core\Datetime\DateFormatter
+   */
+  private $date;
+
+  /**
+   * @var \Drupal\webprofiler\Profiler\ProfilerStorageManager
+   */
+  private $storageManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('profiler'),
+      $container->get('router'),
+      $container->get('template_manager'),
+      $container->get('date.formatter'),
+      $container->get('profiler.storage_manager')
+    );
+  }
+
+  /**
+   * Constructs a new WebprofilerController.
+   *
+   * @param \Drupal\webprofiler\Profiler\Profiler $profiler
+   * @param \Symfony\Component\Routing\RouterInterface $router
+   * @param \Drupal\webprofiler\Profiler\TemplateManager $templateManager
+   * @param \Drupal\Core\Datetime\DateFormatter $date
+   * @param \Drupal\webprofiler\Profiler\ProfilerStorageManager $storageManager
+   */
+  public function __construct(Profiler $profiler, RouterInterface $router, TemplateManager $templateManager, DateFormatter $date, ProfilerStorageManager $storageManager) {
+    $this->profiler = $profiler;
+    $this->router = $router;
+    $this->templateManager = $templateManager;
+    $this->date = $date;
+    $this->storageManager = $storageManager;
+  }
+
+  /**
+   * Generates the dashboard page.
+   *
+   * @param Profile $profile
+   *
+   * @return array
+   */
+  public function dashboardAction(Profile $profile) {
+    $this->profiler->disable();
+
+    $templateManager = $this->templateManager;
+    $templates = $templateManager->getTemplates($profile);
+
+    $panels = [];
+    $libraries = ['webprofiler/dashboard'];
+    $drupalSettings = [
+      'webprofiler' => [
+        'token' => $profile->getToken(),
+        'ide_link' => $this->config('webprofiler.config')->get('ide_link'),
+        'ide_link_remote' => $this->config('webprofiler.config')->get('ide_link_remote'),
+        'ide_link_local' => $this->config('webprofiler.config')->get('ide_link_local'),
+        'collectors' => [],
+      ],
+    ];
+
+    foreach ($templates as $name => $template) {
+      /** @var DrupalDataCollectorInterface $collector */
+      $collector = $profile->getCollector($name);
+
+      if ($collector->hasPanel()) {
+        $rendered = $template->renderBlock('panel', [
+          'token' => $profile->getToken(),
+          'name' => $name,
+        ]);
+
+        $panels[] = [
+          '#theme' => 'webprofiler_panel',
+          '#panel' => $rendered,
+        ];
+
+        $drupalSettings['webprofiler']['collectors'][] = [
+          'id' => $name,
+          'name' => $name,
+          'label' => $collector->getTitle(),
+          'summary' => $collector->getPanelSummary(),
+          'icon' => $collector->getIcon(),
+        ];
+
+        $libraries = array_merge($libraries, $collector->getLibraries());
+        $drupalSettings['webprofiler'] += $collector->getDrupalSettings();
+      }
+    }
+
+    $build = [];
+    $build['panels'] = [
+      '#theme' => 'webprofiler_dashboard',
+      '#profile' => $profile,
+      '#panels' => $panels,
+      '#spinner_path' => '/' . $this->moduleHandler()
+          ->getModule('webprofiler')
+          ->getPath() . '/images/searching.gif',
+      '#attached' => [
+        'drupalSettings' => $drupalSettings,
+        'library' => $libraries,
+      ],
+    ];
+
+    return $build;
+  }
+
+  /**
+   * Generates the list page.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *
+   * @return array
+   */
+  public function listAction(Request $request) {
+    $limit = $request->get('limit', 10);
+    $this->profiler->disable();
+
+    $ip = $request->query->get('ip');
+    $method = $request->query->get('method');
+    $url = $request->query->get('url');
+
+    $profiles = $this->profiler->find($ip, $url, $limit, $method, '', '');
+
+    $rows = [];
+    if (count($profiles)) {
+      foreach ($profiles as $profile) {
+        $row = [];
+        $row[] = $this->l($profile['token'], new Url('webprofiler.dashboard', ['profile' => $profile['token']]));
+        $row[] = $profile['ip'];
+        $row[] = $profile['method'];
+        $row[] = $profile['url'];
+        $row[] = $this->date->format($profile['time']);
+
+        $rows[] = $row;
+      }
+    }
+    else {
+      $rows[] = [
+        [
+          'data' => $this->t('No profiles found'),
+          'colspan' => 6,
+        ],
+      ];
+    }
+
+    $build = [];
+
+    $storage_id = $this->config('webprofiler.config')->get('storage');
+    $storage = $this->storageManager->getStorage($storage_id);
+
+    $build['resume'] = [
+      '#type' => 'inline_template',
+      '#template' => '<p>{{ message }}</p>',
+      '#context' => [
+        'message' => $this->t('Profiles stored with %storage service.', ['%storage' => $storage['title']]),
+      ],
+    ];
+
+    $build['filters'] = $this->formBuilder()
+      ->getForm('Drupal\\webprofiler\\Form\\ProfilesFilterForm');
+
+    $build['table'] = [
+      '#type' => 'table',
+      '#rows' => $rows,
+      '#header' => [
+        $this->t('Token'),
+        [
+          'data' => $this->t('Ip'),
+          'class' => [RESPONSIVE_PRIORITY_LOW],
+        ],
+        [
+          'data' => $this->t('Method'),
+          'class' => [RESPONSIVE_PRIORITY_LOW],
+        ],
+        $this->t('Url'),
+        [
+          'data' => $this->t('Time'),
+          'class' => [RESPONSIVE_PRIORITY_MEDIUM],
+        ],
+      ],
+      '#sticky' => TRUE,
+    ];
+
+    return $build;
+  }
+
+  /**
+   * Exposes collector's data as JSON.
+   *
+   * @param \Symfony\Component\HttpKernel\Profiler\Profile $profile
+   * @param $collector
+   *
+   * @return \Symfony\Component\HttpFoundation\JsonResponse
+   */
+  public function restCollectorAction(Profile $profile, $collector) {
+    $this->profiler->disable();
+
+    $data = $profile->getCollector($collector)->getData();
+
+    return new JsonResponse(['data' => $data]);
+  }
+}