You are here

WebprofilerServiceProvider.php in Devel 8

Namespace

Drupal\webprofiler

File

webprofiler/src/WebprofilerServiceProvider.php
View source
<?php

namespace Drupal\webprofiler;

use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\DependencyInjection\ServiceProviderBase;
use Drupal\webprofiler\Compiler\DecoratorPass;
use Drupal\webprofiler\Compiler\EventPass;
use Drupal\webprofiler\Compiler\ProfilerPass;
use Drupal\webprofiler\Compiler\ServicePass;
use Drupal\webprofiler\Compiler\StoragePass;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
use Symfony\Component\DependencyInjection\Reference;

/**
 * Defines a service profiler for the webprofiler module.
 */
class WebprofilerServiceProvider extends ServiceProviderBase {

  /**
   * {@inheritdoc}
   */
  public function register(ContainerBuilder $container) {

    // Add a compiler pass to discover all data collector services.
    $container
      ->addCompilerPass(new ProfilerPass());

    // Add a compiler pass to discover all available storage backend.
    $container
      ->addCompilerPass(new StoragePass());
    $container
      ->addCompilerPass(new ServicePass(), PassConfig::TYPE_AFTER_REMOVING);
    $container
      ->addCompilerPass(new DecoratorPass(), PassConfig::TYPE_AFTER_REMOVING);
    $modules = $container
      ->getParameter('container.modules');

    // Add ViewsDataCollector only if Views module is enabled.
    if (isset($modules['views'])) {
      $container
        ->register('webprofiler.views', 'Drupal\\webprofiler\\DataCollector\\ViewsDataCollector')
        ->addArgument(new Reference('views.executable'))
        ->addArgument(new Reference('entity.manager'))
        ->addTag('data_collector', [
        'template' => '@webprofiler/Collector/views.html.twig',
        'id' => 'views',
        'title' => 'Views',
        'priority' => 75,
      ]);
    }

    // Add BlockDataCollector only if Block module is enabled.
    if (isset($modules['block'])) {
      $container
        ->register('webprofiler.blocks', 'Drupal\\webprofiler\\DataCollector\\BlocksDataCollector')
        ->addArgument(new Reference('entity_type.manager'))
        ->addTag('data_collector', [
        'template' => '@webprofiler/Collector/blocks.html.twig',
        'id' => 'blocks',
        'title' => 'Blocks',
        'priority' => 78,
      ]);
    }

    // Add TranslationsDataCollector only if Locale module is enabled.
    if (isset($modules['locale'])) {
      $container
        ->register('webprofiler.translations', 'Drupal\\webprofiler\\DataCollector\\TranslationsDataCollector')
        ->addArgument(new Reference('string_translation'))
        ->addArgument(new Reference('url_generator'))
        ->addTag('data_collector', [
        'template' => '@webprofiler/Collector/translations.html.twig',
        'id' => 'translations',
        'title' => 'Translations',
        'priority' => 210,
      ]);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container) {
    $modules = $container
      ->getParameter('container.modules');

    // Alter the views.executable service only if Views module is enabled.
    if (isset($modules['views'])) {
      $container
        ->getDefinition('views.executable')
        ->setClass('Drupal\\webprofiler\\Views\\ViewExecutableFactoryWrapper');
    }

    // Replace the regular form_builder service with a traceable one.
    $container
      ->getDefinition('form_builder')
      ->setClass('Drupal\\webprofiler\\Form\\FormBuilderWrapper');

    // Replace the regular access_manager service with a traceable one.
    $container
      ->getDefinition('access_manager')
      ->setClass('Drupal\\webprofiler\\Access\\AccessManagerWrapper')
      ->addMethodCall('setDataCollector', [
      new Reference('webprofiler.request'),
    ]);

    // Replace the regular theme.negotiator service with a traceable one.
    $container
      ->getDefinition('theme.negotiator')
      ->setClass('Drupal\\webprofiler\\Theme\\ThemeNegotiatorWrapper');

    // Replace the regular config.factory service with a traceable one.
    $container
      ->getDefinition('config.factory')
      ->setClass('Drupal\\webprofiler\\Config\\ConfigFactoryWrapper')
      ->addMethodCall('setDataCollector', [
      new Reference('webprofiler.config'),
    ]);

    // Replace the regular string_translation service with a traceable one.
    $container
      ->getDefinition('string_translation')
      ->setClass('Drupal\\webprofiler\\StringTranslation\\TranslationManagerWrapper');

    // Replace the regular event_dispatcher service with a traceable one.
    $container
      ->getDefinition('event_dispatcher')
      ->setClass('Drupal\\webprofiler\\EventDispatcher\\TraceableEventDispatcher')
      ->addMethodCall('setStopwatch', [
      new Reference('stopwatch'),
    ]);
    $container
      ->getDefinition('http_kernel.basic')
      ->replaceArgument(1, new Reference('webprofiler.debug.controller_resolver'));
  }

}

Classes

Namesort descending Description
WebprofilerServiceProvider Defines a service profiler for the webprofiler module.