PluginProbe
Cookiebot by Usercentrics – Automatic Cookie Banner for GDPR/CCPA & Google Consent Mode / 3.1.0
Cookiebot by Usercentrics – Automatic Cookie Banner for GDPR/CCPA & Google Consent Mode v3.1.0
4.7.3 4.7.2 4.7.1 trunk 2.3.0 2.4.0 2.4.1 2.4.2 2.5.0 3.0.0 3.0.1 3.1.0 3.10.0 3.10.1 3.11.1 3.11.2 3.11.3 3.2.0 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 All 93 releases
cookiebot / addons / lib / ioc / php-di / php-di / src / DI / Definition / Source / SourceChain.php

SourceChain.php in Cookiebot by Usercentrics – Automatic Cookie Banner for GDPR/CCPA & Google Consent Mode 3.1.0, at addons/lib/ioc/php-di/php-di/src/DI/Definition/Source/SourceChain.php

109 lines 2.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * PHP-DI
4 *
5 * @link http://php-di.org/
6 * @copyright Matthieu Napoli (http://mnapoli.fr/)
7 * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
8 */
9
10 namespace DI\Definition\Source;
11
12 use DI\Definition\Definition;
13 use DI\Definition\HasSubDefinition;
14
15 /**
16 * Manages a chain of other definition sources.
17 *
18 * @author Matthieu Napoli <matthieu@mnapoli.fr>
19 */
20 class SourceChain implements DefinitionSource, MutableDefinitionSource
21 {
22 /**
23 * @var DefinitionSource[]
24 */
25 private $sources;
26
27 /**
28 * @var DefinitionSource
29 */
30 private $rootSource;
31
32 /**
33 * @var MutableDefinitionSource|null
34 */
35 private $mutableSource;
36
37 /**
38 * @param DefinitionSource[] $sources
39 */
40 public function __construct(array $sources)
41 {
42 // We want a numerically indexed array to ease the traversal later
43 $this->sources = array_values($sources);
44 $this->rootSource = $this;
45 }
46
47 /**
48 * {@inheritdoc}
49 * @param int $startIndex Use this parameter to start looking from a specific
50 * point in the source chain.
51 */
52 public function getDefinition($name, $startIndex = 0)
53 {
54 $count = count($this->sources);
55 for ($i = $startIndex; $i < $count; $i++) {
56 $source = $this->sources[$i];
57
58 $definition = $source->getDefinition($name);
59
60 if ($definition) {
61 if ($definition instanceof HasSubDefinition) {
62 $this->resolveSubDefinition($definition, $i);
63 }
64 return $definition;
65 }
66 }
67
68 return null;
69 }
70
71 public function addDefinition(Definition $definition)
72 {
73 if (! $this->mutableSource) {
74 throw new \LogicException("The container's definition source has not been initialized correctly");
75 }
76
77 $this->mutableSource->addDefinition($definition);
78 }
79
80 public function setRootDefinitionSource(DefinitionSource $rootSource)
81 {
82 $this->rootSource = $rootSource;
83 }
84
85 private function resolveSubDefinition(HasSubDefinition $definition, $currentIndex)
86 {
87 $subDefinitionName = $definition->getSubDefinitionName();
88
89 if ($subDefinitionName === $definition->getName()) {
90 // Extending itself: look in the next sources only (else infinite recursion)
91 $subDefinition = $this->getDefinition($subDefinitionName, $currentIndex + 1);
92 } else {
93 // Extending another definition: look from the root
94 $subDefinition = $this->rootSource->getDefinition($subDefinitionName);
95 }
96
97 if ($subDefinition) {
98 $definition->setSubDefinition($subDefinition);
99 }
100 }
101
102 public function setMutableDefinitionSource(MutableDefinitionSource $mutableSource)
103 {
104 $this->mutableSource = $mutableSource;
105
106 array_unshift($this->sources, $mutableSource);
107 }
108 }
109