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 / ParameterResolver.php

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

114 lines 3.9 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\ObjectDefinition\MethodInjection;
11 use ReflectionMethod;
12 use ReflectionParameter;
13
14 /**
15 * Resolves parameters for a function call.
16 *
17 * @since 4.2
18 * @author Matthieu Napoli <[email protected]>
19 */
20 class ParameterResolver
21 {
22 /**
23 * @var DefinitionResolver
24 */
25 private $definitionResolver;
26
27 /**
28 * @param DefinitionResolver $definitionResolver Will be used to resolve nested definitions.
29 */
30 public function __construct(DefinitionResolver $definitionResolver)
31 {
32 $this->definitionResolver = $definitionResolver;
33 }
34
35 /**
36 * @throws InvalidDefinition A parameter has no value defined or guessable.
37 * @return array Parameters to use to call the function.
38 */
39 public function resolveParameters(
40 ?MethodInjection $definition = null,
41 ?ReflectionMethod $method = null,
42 array $parameters = []
43 ) {
44 $args = [];
45
46 if (! $method) {
47 return $args;
48 }
49
50 $definitionParameters = $definition ? $definition->getParameters() : [];
51
52 foreach ($method->getParameters() as $index => $parameter) {
53 if (array_key_exists($parameter->getName(), $parameters)) {
54 // Look in the $parameters array
55 $value = &$parameters[$parameter->getName()];
56 } elseif (array_key_exists($index, $definitionParameters)) {
57 // Look in the definition
58 $value = &$definitionParameters[$index];
59 } else {
60 // If the parameter is optional and wasn't specified, we take its default value
61 if ($parameter->isDefaultValueAvailable() || $parameter->isOptional()) {
62 $args[] = $this->getParameterDefaultValue($parameter, $method);
63 continue;
64 }
65
66 throw new InvalidDefinition(sprintf(
67 'Parameter $%s of %s has no value defined or guessable',
68 $parameter->getName(),
69 $this->getFunctionName($method)
70 ));
71 }
72
73 // Nested definitions
74 if ($value instanceof Definition) {
75 // If the container cannot produce the entry, we can use the default parameter value
76 if ($parameter->isOptional() && ! $this->definitionResolver->isResolvable($value)) {
77 $value = $this->getParameterDefaultValue($parameter, $method);
78 } else {
79 $value = $this->definitionResolver->resolve($value);
80 }
81 }
82
83 $args[] = &$value;
84 }
85
86 return $args;
87 }
88
89 /**
90 * Returns the default value of a function parameter.
91 *
92 * @throws InvalidDefinition Can't get default values from PHP internal classes and functions
93 * @return mixed
94 */
95 private function getParameterDefaultValue(ReflectionParameter $parameter, ReflectionMethod $function)
96 {
97 try {
98 return $parameter->getDefaultValue();
99 } catch (\ReflectionException $e) {
100 throw new InvalidDefinition(sprintf(
101 'The parameter "%s" of %s has no type defined or guessable. It has a default value, '
102 . 'but the default value can\'t be read through Reflection because it is a PHP internal class.',
103 $parameter->getName(),
104 $this->getFunctionName($function)
105 ));
106 }
107 }
108
109 private function getFunctionName(ReflectionMethod $method) : string
110 {
111 return $method->getName() . '()';
112 }
113 }
114