PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.2
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.2
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 3.5.1 All 200 releases
betterdocs / includes / Dependencies / DI / Definition / Resolver / FactoryResolver.php

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

125 lines 4.3 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\Definition\FactoryDefinition;
11 use WPDeveloper\BetterDocs\Dependencies\DI\Invoker\FactoryParameterResolver;
12 use WPDeveloper\BetterDocs\Dependencies\Invoker\Exception\NotCallableException;
13 use WPDeveloper\BetterDocs\Dependencies\Invoker\Exception\NotEnoughParametersException;
14 use WPDeveloper\BetterDocs\Dependencies\Invoker\Invoker;
15 use WPDeveloper\BetterDocs\Dependencies\Invoker\ParameterResolver\AssociativeArrayResolver;
16 use WPDeveloper\BetterDocs\Dependencies\Invoker\ParameterResolver\NumericArrayResolver;
17 use WPDeveloper\BetterDocs\Dependencies\Invoker\ParameterResolver\ResolverChain;
18 use WPDeveloper\BetterDocs\Dependencies\Psr\Container\ContainerInterface;
19
20 /**
21 * Resolves a factory definition to a value.
22 *
23 * @since 4.0
24 * @author Matthieu Napoli <matthieu@mnapoli.fr>
25 */
26 class FactoryResolver implements DefinitionResolver
27 {
28 /**
29 * @var ContainerInterface
30 */
31 private $container;
32
33 /**
34 * @var WPDeveloper\BetterDocs\Dependencies\Invoker|null
35 */
36 private $invoker;
37
38 /**
39 * @var DefinitionResolver
40 */
41 private $resolver;
42
43 /**
44 * The resolver needs a container. This container will be passed to the factory as a parameter
45 * so that the factory can access other entries of the container.
46 */
47 public function __construct(ContainerInterface $container, DefinitionResolver $resolver)
48 {
49 $this->container = $container;
50 $this->resolver = $resolver;
51 }
52
53 /**
54 * Resolve a factory definition to a value.
55 *
56 * This will call the callable of the definition.
57 *
58 * @param FactoryDefinition $definition
59 *
60 * {@inheritdoc}
61 */
62 public function resolve(Definition $definition, array $parameters = [])
63 {
64 if (! $this->invoker) {
65 $parameterResolver = new ResolverChain([
66 new AssociativeArrayResolver,
67 new FactoryParameterResolver($this->container),
68 new NumericArrayResolver,
69 ]);
70
71 $this->invoker = new Invoker($parameterResolver, $this->container);
72 }
73
74 $callable = $definition->getCallable();
75
76 try {
77 $providedParams = [$this->container, $definition];
78 $extraParams = $this->resolveExtraParams($definition->getParameters());
79 $providedParams = array_merge($providedParams, $extraParams);
80
81 return $this->invoker->call($callable, $providedParams);
82 } catch (NotCallableException $e) {
83 // Custom error message to help debugging
84 if (is_string($callable) && class_exists($callable) && method_exists($callable, '__invoke')) {
85 throw new InvalidDefinition(sprintf(
86 'Entry "%s" cannot be resolved: factory %s. Invokable classes cannot be automatically resolved if autowiring is disabled on the container, you need to enable autowiring or define the entry manually.',
87 $definition->getName(),
88 $e->getMessage()
89 ));
90 }
91
92 throw new InvalidDefinition(sprintf(
93 'Entry "%s" cannot be resolved: factory %s',
94 $definition->getName(),
95 $e->getMessage()
96 ));
97 } catch (NotEnoughParametersException $e) {
98 throw new InvalidDefinition(sprintf(
99 'Entry "%s" cannot be resolved: %s',
100 $definition->getName(),
101 $e->getMessage()
102 ));
103 }
104 }
105
106 public function isResolvable(Definition $definition, array $parameters = []) : bool
107 {
108 return true;
109 }
110
111 private function resolveExtraParams(array $params) : array
112 {
113 $resolved = [];
114 foreach ($params as $key => $value) {
115 // Nested definitions
116 if ($value instanceof Definition) {
117 $value = $this->resolver->resolve($value);
118 }
119 $resolved[$key] = $value;
120 }
121
122 return $resolved;
123 }
124 }
125