PluginProbe
Defender Security – Malware Scanner, Login Security & Firewall / 5.4.0
Defender Security – Malware Scanner, Login Security & Firewall v5.4.0
6.3.0 6.2.3 6.2.4 6.2.0 6.2.1 6.2.2 6.1.0 5.3.1 5.4.0 5.4.1 5.5.0 5.5.1 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.7.2 5.8.0 5.8.1 5.9.0 6.0.0 6.0.1 3.0.1 3.1.0 All 141 releases
defender-security / lib / packages / DI / CompiledContainer.php

CompiledContainer.php in Defender Security – Malware Scanner, Login Security & Firewall 5.4.0, at lib/packages/DI/CompiledContainer.php

130 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 declare(strict_types=1);
4
5 namespace WPMU_DEV\Defender\Vendor\DI;
6
7 use WPMU_DEV\Defender\Vendor\DI\Compiler\RequestedEntryHolder;
8 use WPMU_DEV\Defender\Vendor\DI\Definition\Definition;
9 use WPMU_DEV\Defender\Vendor\DI\Definition\Exception\InvalidDefinition;
10 use WPMU_DEV\Defender\Vendor\DI\Invoker\FactoryParameterResolver;
11 use WPMU_DEV\Defender\Vendor\Invoker\Exception\NotCallableException;
12 use WPMU_DEV\Defender\Vendor\Invoker\Exception\NotEnoughParametersException;
13 use WPMU_DEV\Defender\Vendor\Invoker\Invoker;
14 use WPMU_DEV\Defender\Vendor\Invoker\InvokerInterface;
15 use WPMU_DEV\Defender\Vendor\Invoker\ParameterResolver\AssociativeArrayResolver;
16 use WPMU_DEV\Defender\Vendor\Invoker\ParameterResolver\DefaultValueResolver;
17 use WPMU_DEV\Defender\Vendor\Invoker\ParameterResolver\NumericArrayResolver;
18 use WPMU_DEV\Defender\Vendor\Invoker\ParameterResolver\ResolverChain;
19
20 /**
21 * Compiled version of the dependency injection container.
22 *
23 * @author Matthieu Napoli <[email protected]>
24 */
25 abstract class CompiledContainer extends Container
26 {
27 /**
28 * This const is overridden in child classes (compiled containers).
29 * @var array
30 */
31 protected const METHOD_MAPPING = [];
32
33 /**
34 * @var InvokerInterface
35 */
36 private $factoryInvoker;
37
38 /**
39 * {@inheritdoc}
40 */
41 public function get($name)
42 {
43 // Try to find the entry in the singleton map
44 if (isset($this->resolvedEntries[$name]) || array_key_exists($name, $this->resolvedEntries)) {
45 return $this->resolvedEntries[$name];
46 }
47
48 $method = static::METHOD_MAPPING[$name] ?? null;
49
50 // If it's a compiled entry, then there is a method in this class
51 if ($method !== null) {
52 // Check if we are already getting this entry -> circular dependency
53 if (isset($this->entriesBeingResolved[$name])) {
54 throw new DependencyException("Circular dependency detected while trying to resolve entry '$name'");
55 }
56 $this->entriesBeingResolved[$name] = true;
57
58 try {
59 $value = $this->$method();
60 } finally {
61 unset($this->entriesBeingResolved[$name]);
62 }
63
64 // Store the entry to always return it without recomputing it
65 $this->resolvedEntries[$name] = $value;
66
67 return $value;
68 }
69
70 return parent::get($name);
71 }
72
73 /**
74 * {@inheritdoc}
75 */
76 public function has($name)
77 {
78 if (! is_string($name)) {
79 throw new \InvalidArgumentException(sprintf(
80 'The name parameter must be of type string, %s given',
81 is_object($name) ? get_class($name) : gettype($name)
82 ));
83 }
84
85 // The parent method is overridden to check in our array, it avoids resolving definitions
86 if (isset(static::METHOD_MAPPING[$name])) {
87 return true;
88 }
89
90 return parent::has($name);
91 }
92
93 protected function setDefinition(string $name, Definition $definition)
94 {
95 // It needs to be forbidden because that would mean get() must go through the definitions
96 // every time, which kinds of defeats the performance gains of the compiled container
97 throw new \LogicException('You cannot set a definition at runtime on a compiled container. You can either put your definitions in a file, disable compilation or ->set() a raw value directly (PHP object, string, int, ...) instead of a PHP-WPMU_DEV\Defender\Vendor\DI definition.');
98 }
99
100 /**
101 * Invoke the given callable.
102 */
103 protected function resolveFactory($callable, $entryName, array $extraParameters = [])
104 {
105 // Initialize the factory resolver
106 if (! $this->factoryInvoker) {
107 $parameterResolver = new ResolverChain([
108 new AssociativeArrayResolver,
109 new FactoryParameterResolver($this->delegateContainer),
110 new NumericArrayResolver,
111 new DefaultValueResolver,
112 ]);
113
114 $this->factoryInvoker = new Invoker($parameterResolver, $this->delegateContainer);
115 }
116
117 $parameters = [$this->delegateContainer, new RequestedEntryHolder($entryName)];
118
119 $parameters = array_merge($parameters, $extraParameters);
120
121 try {
122 return $this->factoryInvoker->call($callable, $parameters);
123 } catch (NotCallableException $e) {
124 throw new InvalidDefinition("Entry \"$entryName\" cannot be resolved: factory " . $e->getMessage());
125 } catch (NotEnoughParametersException $e) {
126 throw new InvalidDefinition("Entry \"$entryName\" cannot be resolved: " . $e->getMessage());
127 }
128 }
129 }
130