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\CompilerView 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 |