function ProxyServicesPass::process

Same name 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. 10 core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php \Drupal\Core\DependencyInjection\Compiler\ProxyServicesPass::process()

File

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

Class

ProxyServicesPass
Replaces all services with a lazy flag.

Namespace

Drupal\Core\DependencyInjection\Compiler

Code

public function process(ContainerBuilder $container) : void {
    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.