Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. CheckCircularReferencesPass.php

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

  • class \Symfony\Component\DependencyInjection\Compiler\CheckCircularReferencesPass implements \Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface

Expanded class hierarchy of CheckCircularReferencesPass

1 file declares its use of CheckCircularReferencesPass
PhpDumper.php in vendor/symfony/dependency-injection/Dumper/PhpDumper.php

File

vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php, line 27

Namespace

Symfony\Component\DependencyInjection\Compiler
View source
class CheckCircularReferencesPass implements CompilerPassInterface {
    private array $currentPath;
    private array $checkedNodes;
    
    /**
     * Checks the ContainerBuilder object for circular references.
     */
    public function process(ContainerBuilder $container) : void {
        $graph = $container->getCompiler()
            ->getServiceReferenceGraph();
        $this->checkedNodes = [];
        foreach ($graph->getNodes() as $id => $node) {
            $this->currentPath = [
                $id,
            ];
            $this->checkOutEdges($node->getOutEdges());
        }
    }
    
    /**
     * Checks for circular references.
     *
     * @param ServiceReferenceGraphEdge[] $edges An array of Edges
     *
     * @throws ServiceCircularReferenceException when a circular reference is found
     */
    private function checkOutEdges(array $edges) : void {
        foreach ($edges as $edge) {
            $node = $edge->getDestNode();
            $id = $node->getId();
            if (empty($this->checkedNodes[$id])) {
                // Don't check circular references for lazy edges
                if (!$node->getValue() || !$edge->isLazy() && !$edge->isWeak()) {
                    $searchKey = array_search($id, $this->currentPath);
                    $this->currentPath[] = $id;
                    if (false !== $searchKey) {
                        throw new ServiceCircularReferenceException($id, \array_slice($this->currentPath, $searchKey));
                    }
                    $this->checkOutEdges($node->getOutEdges());
                }
                $this->checkedNodes[$id] = true;
                array_pop($this->currentPath);
            }
        }
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
CheckCircularReferencesPass::$checkedNodes 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
RSS feed
Powered by Drupal