You are here

public function DependencySerializationTraitPass::process in Drupal 10

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/DependencyInjection/Compiler/DependencySerializationTraitPass.php \Drupal\Core\DependencyInjection\Compiler\DependencySerializationTraitPass::process()
  2. 9 core/lib/Drupal/Core/DependencyInjection/Compiler/DependencySerializationTraitPass.php \Drupal\Core\DependencyInjection\Compiler\DependencySerializationTraitPass::process()

File

core/lib/Drupal/Core/DependencyInjection/Compiler/DependencySerializationTraitPass.php, line 18

Class

DependencySerializationTraitPass
Sets the _serviceId property on all services.

Namespace

Drupal\Core\DependencyInjection\Compiler

Code

public function process(ContainerBuilder $container) {
  $decorations = new \SplPriorityQueue();
  $order = PHP_INT_MAX;
  foreach ($container
    ->getDefinitions() as $service_id => $definition) {

    // Only add the property to services that are public (as private services
    // can not be reloaded through Container::get()) and are objects.
    if (!$definition
      ->hasTag('parameter_service') && $definition
      ->isPublic()) {
      $definition
        ->setProperty('_serviceId', $service_id);
    }
    if ($decorated = $definition
      ->getDecoratedService()) {
      $decorations
        ->insert([
        $service_id,
        $definition,
      ], [
        $decorated[2],
        --$order,
      ]);
    }
  }
  foreach ($decorations as list($service_id, $definition)) {
    list($inner, $renamedId) = $definition
      ->getDecoratedService();
    if (!$renamedId) {
      $renamedId = $service_id . '.inner';
    }
    $original = $container
      ->getDefinition($inner);
    if ($original
      ->isPublic()) {

      // The old service is renamed.
      $original
        ->setProperty('_serviceId', $renamedId);

      // The decorating service takes over the old ID.
      $definition
        ->setProperty('_serviceId', $inner);
    }
  }
}