PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.3
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.3
4.9.3 4.9.2 4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 3.4.2 3.5.0 All 201 releases
betterdocs / includes / Dependencies / DI / Definition / Resolver / ResolverDispatcher.php

ResolverDispatcher.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 4.9.3, at includes/Dependencies/DI/Definition/Resolver/ResolverDispatcher.php

129 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // phpcs:ignoreFile -- Bundled third-party (Mozart) dependency; exempt from plugin coding standards.
3
4 declare(strict_types=1);
5
6 namespace WPDeveloper\BetterDocs\Dependencies\DI\Definition\Resolver;
7
8 use WPDeveloper\BetterDocs\Dependencies\DI\Definition\Definition;
9 use WPDeveloper\BetterDocs\Dependencies\DI\Definition\Exception\InvalidDefinition;
10 use WPDeveloper\BetterDocs\Dependencies\DI\Proxy\ProxyFactory;
11 use WPDeveloper\BetterDocs\Dependencies\Psr\Container\ContainerInterface;
12
13 /**
14 * Dispatches to more specific resolvers.
15 *
16 * Dynamic dispatch pattern.
17 *
18 * @since 5.0
19 * @author Matthieu Napoli <[email protected]>
20 */
21 class ResolverDispatcher implements DefinitionResolver
22 {
23 /**
24 * @var ContainerInterface
25 */
26 private $container;
27
28 /**
29 * @var ProxyFactory
30 */
31 private $proxyFactory;
32
33 private $arrayResolver;
34 private $factoryResolver;
35 private $decoratorResolver;
36 private $objectResolver;
37 private $instanceResolver;
38 private $envVariableResolver;
39
40 public function __construct(ContainerInterface $container, ProxyFactory $proxyFactory)
41 {
42 $this->container = $container;
43 $this->proxyFactory = $proxyFactory;
44 }
45
46 /**
47 * Resolve a definition to a value.
48 *
49 * @param Definition $definition Object that defines how the value should be obtained.
50 * @param array $parameters Optional parameters to use to build the entry.
51 *
52 * @throws InvalidDefinition If the definition cannot be resolved.
53 *
54 * @return mixed Value obtained from the definition.
55 */
56 public function resolve(Definition $definition, array $parameters = [])
57 {
58 // Special case, tested early for speed
59 if ($definition instanceof \WPDeveloper\BetterDocs\Dependencies\DI\Definition\SelfResolvingDefinition) {
60 return $definition->resolve($this->container);
61 }
62
63 $definitionResolver = $this->getDefinitionResolver($definition);
64
65 return $definitionResolver->resolve($definition, $parameters);
66 }
67
68 public function isResolvable(Definition $definition, array $parameters = []) : bool
69 {
70 // Special case, tested early for speed
71 if ($definition instanceof \WPDeveloper\BetterDocs\Dependencies\DI\Definition\SelfResolvingDefinition) {
72 return $definition->isResolvable($this->container);
73 }
74
75 $definitionResolver = $this->getDefinitionResolver($definition);
76
77 return $definitionResolver->isResolvable($definition, $parameters);
78 }
79
80 /**
81 * Returns a resolver capable of handling the given definition.
82 *
83 * @throws \RuntimeException No definition resolver was found for this type of definition.
84 */
85 private function getDefinitionResolver(Definition $definition) : DefinitionResolver
86 {
87 switch (true) {
88 case $definition instanceof \WPDeveloper\BetterDocs\Dependencies\DI\Definition\ObjectDefinition:
89 if (! $this->objectResolver) {
90 $this->objectResolver = new ObjectCreator($this, $this->proxyFactory);
91 }
92
93 return $this->objectResolver;
94 case $definition instanceof \WPDeveloper\BetterDocs\Dependencies\DI\Definition\DecoratorDefinition:
95 if (! $this->decoratorResolver) {
96 $this->decoratorResolver = new DecoratorResolver($this->container, $this);
97 }
98
99 return $this->decoratorResolver;
100 case $definition instanceof \WPDeveloper\BetterDocs\Dependencies\DI\Definition\FactoryDefinition:
101 if (! $this->factoryResolver) {
102 $this->factoryResolver = new FactoryResolver($this->container, $this);
103 }
104
105 return $this->factoryResolver;
106 case $definition instanceof \WPDeveloper\BetterDocs\Dependencies\DI\Definition\ArrayDefinition:
107 if (! $this->arrayResolver) {
108 $this->arrayResolver = new ArrayResolver($this);
109 }
110
111 return $this->arrayResolver;
112 case $definition instanceof \WPDeveloper\BetterDocs\Dependencies\DI\Definition\EnvironmentVariableDefinition:
113 if (! $this->envVariableResolver) {
114 $this->envVariableResolver = new EnvironmentVariableResolver($this);
115 }
116
117 return $this->envVariableResolver;
118 case $definition instanceof \WPDeveloper\BetterDocs\Dependencies\DI\Definition\InstanceDefinition:
119 if (! $this->instanceResolver) {
120 $this->instanceResolver = new InstanceInjector($this, $this->proxyFactory);
121 }
122
123 return $this->instanceResolver;
124 default:
125 throw new \RuntimeException('No definition resolver was configured for definition of type ' . get_class($definition));
126 }
127 }
128 }
129