You are here

public function RemoveUnusedDefinitionsPass::process in Service Container 7.2

Same name and namespace in other branches
  1. 7 modules/providers/service_container_symfony/lib/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php \Symfony\Component\DependencyInjection\Compiler\RemoveUnusedDefinitionsPass::process()

Processes the ContainerBuilder to remove unused definitions.

Parameters

ContainerBuilder $container:

Overrides CompilerPassInterface::process

File

modules/providers/service_container_symfony/lib/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php, line 38

Class

RemoveUnusedDefinitionsPass
Removes unused service definitions from the container.

Namespace

Symfony\Component\DependencyInjection\Compiler

Code

public function process(ContainerBuilder $container) {
  $compiler = $container
    ->getCompiler();
  $formatter = $compiler
    ->getLoggingFormatter();
  $graph = $compiler
    ->getServiceReferenceGraph();
  $hasChanged = false;
  foreach ($container
    ->getDefinitions() as $id => $definition) {
    if ($definition
      ->isPublic()) {
      continue;
    }
    if ($graph
      ->hasNode($id)) {
      $edges = $graph
        ->getNode($id)
        ->getInEdges();
      $referencingAliases = array();
      $sourceIds = array();
      foreach ($edges as $edge) {
        $node = $edge
          ->getSourceNode();
        $sourceIds[] = $node
          ->getId();
        if ($node
          ->isAlias()) {
          $referencingAliases[] = $node
            ->getValue();
        }
      }
      $isReferenced = count(array_unique($sourceIds)) - count($referencingAliases) > 0;
    }
    else {
      $referencingAliases = array();
      $isReferenced = false;
    }
    if (1 === count($referencingAliases) && false === $isReferenced) {
      $container
        ->setDefinition((string) reset($referencingAliases), $definition);
      $definition
        ->setPublic(true);
      $container
        ->removeDefinition($id);
      $compiler
        ->addLogMessage($formatter
        ->formatRemoveService($this, $id, 'replaces alias ' . reset($referencingAliases)));
    }
    elseif (0 === count($referencingAliases) && false === $isReferenced) {
      $container
        ->removeDefinition($id);
      $compiler
        ->addLogMessage($formatter
        ->formatRemoveService($this, $id, 'unused'));
      $hasChanged = true;
    }
  }
  if ($hasChanged) {
    $this->repeatedPass
      ->setRepeat();
  }
}