Mercurial > hg > isophonics-drupal-site
comparison vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 /* | |
4 * This file is part of the Symfony package. | |
5 * | |
6 * (c) Fabien Potencier <fabien@symfony.com> | |
7 * | |
8 * For the full copyright and license information, please view the LICENSE | |
9 * file that was distributed with this source code. | |
10 */ | |
11 | |
12 namespace Symfony\Component\DependencyInjection\Compiler; | |
13 | |
14 use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; | |
15 use Symfony\Component\DependencyInjection\ContainerBuilder; | |
16 | |
17 /** | |
18 * Checks your services for circular references. | |
19 * | |
20 * References from method calls are ignored since we might be able to resolve | |
21 * these references depending on the order in which services are called. | |
22 * | |
23 * Circular reference from method calls will only be detected at run-time. | |
24 * | |
25 * @author Johannes M. Schmitt <schmittjoh@gmail.com> | |
26 */ | |
27 class CheckCircularReferencesPass implements CompilerPassInterface | |
28 { | |
29 private $currentPath; | |
30 private $checkedNodes; | |
31 | |
32 /** | |
33 * Checks the ContainerBuilder object for circular references. | |
34 * | |
35 * @param ContainerBuilder $container The ContainerBuilder instances | |
36 */ | |
37 public function process(ContainerBuilder $container) | |
38 { | |
39 $graph = $container->getCompiler()->getServiceReferenceGraph(); | |
40 | |
41 $this->checkedNodes = array(); | |
42 foreach ($graph->getNodes() as $id => $node) { | |
43 $this->currentPath = array($id); | |
44 | |
45 $this->checkOutEdges($node->getOutEdges()); | |
46 } | |
47 } | |
48 | |
49 /** | |
50 * Checks for circular references. | |
51 * | |
52 * @param ServiceReferenceGraphEdge[] $edges An array of Edges | |
53 * | |
54 * @throws ServiceCircularReferenceException When a circular reference is found. | |
55 */ | |
56 private function checkOutEdges(array $edges) | |
57 { | |
58 foreach ($edges as $edge) { | |
59 $node = $edge->getDestNode(); | |
60 $id = $node->getId(); | |
61 | |
62 if (empty($this->checkedNodes[$id])) { | |
63 // don't check circular dependencies for lazy services | |
64 if (!$node->getValue() || !$node->getValue()->isLazy()) { | |
65 $searchKey = array_search($id, $this->currentPath); | |
66 $this->currentPath[] = $id; | |
67 | |
68 if (false !== $searchKey) { | |
69 throw new ServiceCircularReferenceException($id, array_slice($this->currentPath, $searchKey)); | |
70 } | |
71 | |
72 $this->checkOutEdges($node->getOutEdges()); | |
73 } | |
74 | |
75 $this->checkedNodes[$id] = true; | |
76 array_pop($this->currentPath); | |
77 } | |
78 } | |
79 } | |
80 } |