function ProxyServicesPass::process

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php \Drupal\Core\DependencyInjection\Compiler\ProxyServicesPass::process()
  2. 8.9.x core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php \Drupal\Core\DependencyInjection\Compiler\ProxyServicesPass::process()
  3. 11.x core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php \Drupal\Core\DependencyInjection\Compiler\ProxyServicesPass::process()

phpcs:ignore Drupal.Commenting.FunctionComment.VoidReturn

Return value

void

File

core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php, line 23

Class

ProxyServicesPass
Replaces all services with a lazy flag.

Namespace

Drupal\Core\DependencyInjection\Compiler

Code

public function process(ContainerBuilder $container) {
  foreach ($container->getDefinitions() as $service_id => $definition) {
    if ($definition->isLazy()) {
      $proxy_class = ProxyBuilder::buildProxyClassName($definition->getClass());
      if (class_exists($proxy_class)) {
        // Copy the existing definition to a new entry.
        $definition->setLazy(FALSE);
        // Ensure that the service is accessible.
        $definition->setPublic(TRUE);
        $new_service_id = 'drupal.proxy_original_service.' . $service_id;
        $container->setDefinition($new_service_id, $definition);
        $container->register($service_id, $proxy_class)
          ->setArguments([
          new Reference('service_container'),
          $new_service_id,
        ]);
      }
      else {
        $class_name = $definition->getClass();
        // Find the root namespace.
        $match = [];
        preg_match('/([a-zA-Z0-9_]+\\\\[a-zA-Z0-9_]+)\\\\(.+)/', $class_name, $match);
        $root_namespace = $match[1];
        // Find the root namespace path.
        $root_namespace_dir = '[namespace_root_path]';
        $namespaces = $container->getParameter('container.namespaces');
        // Hardcode Drupal Core, because it is not registered.
        $namespaces['Drupal\\Core'] = 'core/lib/Drupal/Core';
        if (isset($namespaces[$root_namespace])) {
          $root_namespace_dir = $namespaces[$root_namespace];
        }
        $message = <<<EOF

Missing proxy class '{<span class="php-variable">$proxy_class</span>}' for lazy service '{<span class="php-variable">$service_id</span>}'.
Use the following command to generate the proxy class:
  php core/scripts/generate-proxy-class.php '{<span class="php-variable">$class_name</span>}' "{<span class="php-variable">$root_namespace_dir</span>}"


EOF;
        trigger_error($message, E_USER_WARNING);
      }
    }
  }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.