ProxyServicesPass.php

Same filename in other branches
  1. 9 core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php
  2. 10 core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php
  3. 11.x core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php

Namespace

Drupal\Core\DependencyInjection\Compiler

File

core/lib/Drupal/Core/DependencyInjection/Compiler/ProxyServicesPass.php

View source
<?php

namespace Drupal\Core\DependencyInjection\Compiler;

use Drupal\Component\ProxyBuilder\ProxyBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

/**
 * Replaces all services with a lazy flag.
 */
class ProxyServicesPass implements CompilerPassInterface {
    
    /**
     * {@inheritdoc}
     */
    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);
                }
            }
        }
    }

}

Classes

Title Deprecated Summary
ProxyServicesPass Replaces all services with a lazy flag.

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