DashboardController.php

Namespace

Drupal\webprofiler\Controller

File

webprofiler/src/Controller/DashboardController.php

View source
<?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,
        ]);
    }

}

Classes

Title Deprecated Summary
DashboardController Class DashboardController