class CheckCircularReferencesPass

Checks your services for circular references

References from method calls are ignored since we might be able to resolve these references depending on the order in which services are called.

Circular reference from method calls will only be detected at run-time.

@author Johannes M. Schmitt <schmittjoh@gmail.com>

Hierarchy

Expanded class hierarchy of CheckCircularReferencesPass

1 file declares its use of CheckCircularReferencesPass
CheckCircularReferencesPassTest.php in drupal/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php

File

drupal/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php, line 27

Namespace

Symfony\Component\DependencyInjection\Compiler
View source
class CheckCircularReferencesPass implements CompilerPassInterface {
  private $currentId;
  private $currentPath;

  /**
   * Checks the ContainerBuilder object for circular references.
   *
   * @param ContainerBuilder $container The ContainerBuilder instances
   */
  public function process(ContainerBuilder $container) {
    $graph = $container
      ->getCompiler()
      ->getServiceReferenceGraph();
    foreach ($graph
      ->getNodes() as $id => $node) {
      $this->currentId = $id;
      $this->currentPath = array(
        $id,
      );
      $this
        ->checkOutEdges($node
        ->getOutEdges());
    }
  }

  /**
   * Checks for circular references.
   *
   * @param array $edges An array of Nodes
   *
   * @throws ServiceCircularReferenceException When a circular reference is found.
   */
  private function checkOutEdges(array $edges) {
    foreach ($edges as $edge) {
      $node = $edge
        ->getDestNode();
      $this->currentPath[] = $id = $node
        ->getId();
      if ($this->currentId === $id) {
        throw new ServiceCircularReferenceException($this->currentId, $this->currentPath);
      }
      $this
        ->checkOutEdges($node
        ->getOutEdges());
      array_pop($this->currentPath);
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CheckCircularReferencesPass::$currentId private property
CheckCircularReferencesPass::$currentPath private property
CheckCircularReferencesPass::checkOutEdges private function Checks for circular references.
CheckCircularReferencesPass::process public function Checks the ContainerBuilder object for circular references. Overrides CompilerPassInterface::process