Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace DI\Invoker;
6
 
7
use DI\Definition\Definition;
8
use DI\Definition\Helper\DefinitionHelper;
9
use DI\Definition\Resolver\DefinitionResolver;
10
use Invoker\ParameterResolver\ParameterResolver;
11
use ReflectionFunctionAbstract;
12
 
13
/**
14
 * Resolves callable parameters using definitions.
15
 *
16
 * @since 5.0
17
 * @author Matthieu Napoli <matthieu@mnapoli.fr>
18
 */
19
class DefinitionParameterResolver implements ParameterResolver
20
{
21
    public function __construct(
22
        private DefinitionResolver $definitionResolver
23
    ) {
24
    }
25
 
26
    public function getParameters(
27
        ReflectionFunctionAbstract $reflection,
28
        array $providedParameters,
29
        array $resolvedParameters
30
    ) : array {
31
        // Skip parameters already resolved
32
        if (! empty($resolvedParameters)) {
33
            $providedParameters = array_diff_key($providedParameters, $resolvedParameters);
34
        }
35
 
36
        foreach ($providedParameters as $key => $value) {
37
            if ($value instanceof DefinitionHelper) {
38
                $value = $value->getDefinition('');
39
            }
40
 
41
            if (! $value instanceof Definition) {
42
                continue;
43
            }
44
 
45
            $value = $this->definitionResolver->resolve($value);
46
 
47
            if (is_int($key)) {
48
                // Indexed by position
49
                $resolvedParameters[$key] = $value;
50
            } else {
51
                // Indexed by parameter name
52
                // TODO optimize?
53
                $reflectionParameters = $reflection->getParameters();
54
                foreach ($reflectionParameters as $reflectionParameter) {
55
                    if ($key === $reflectionParameter->name) {
56
                        $resolvedParameters[$reflectionParameter->getPosition()] = $value;
57
                    }
58
                }
59
            }
60
        }
61
 
62
        return $resolvedParameters;
63
    }
64
}