PluginProbe
Defender Security – Malware Scanner, Login Security & Firewall / 3.0.1
Defender Security – Malware Scanner, Login Security & Firewall v3.0.1
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 / vendor / php-di / php-di / src / DI / Definition / Resolver / ParameterResolver.php

ParameterResolver.php in Defender Security – Malware Scanner, Login Security & Firewall 3.0.1, at vendor/php-di/php-di/src/DI/Definition/Resolver/ParameterResolver.php

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