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\Definition\Resolver;
6
 
7
use DI\Definition\ArrayDefinition;
8
use DI\Definition\Definition;
9
use DI\DependencyException;
10
use Exception;
11
 
12
/**
13
 * Resolves an array definition to a value.
14
 *
15
 * @template-implements DefinitionResolver<ArrayDefinition>
16
 *
17
 * @since 5.0
18
 * @author Matthieu Napoli <matthieu@mnapoli.fr>
19
 */
20
class ArrayResolver implements DefinitionResolver
21
{
22
    /**
23
     * @param DefinitionResolver $definitionResolver Used to resolve nested definitions.
24
     */
25
    public function __construct(
26
        private DefinitionResolver $definitionResolver
27
    ) {
28
    }
29
 
30
    /**
31
     * {@inheritDoc}
32
     *
33
     * Resolve an array definition to a value.
34
     *
35
     * An array definition can contain simple values or references to other entries.
36
     *
37
     * @param ArrayDefinition $definition
38
     */
39
    public function resolve(Definition $definition, array $parameters = []) : array
40
    {
41
        $values = $definition->getValues();
42
 
43
        // Resolve nested definitions
44
        array_walk_recursive($values, function (& $value, $key) use ($definition) {
45
            if ($value instanceof Definition) {
46
                $value = $this->resolveDefinition($value, $definition, $key);
47
            }
48
        });
49
 
50
        return $values;
51
    }
52
 
53
    public function isResolvable(Definition $definition, array $parameters = []) : bool
54
    {
55
        return true;
56
    }
57
 
58
    /**
59
     * @throws DependencyException
60
     */
61
    private function resolveDefinition(Definition $value, ArrayDefinition $definition, int|string $key) : mixed
62
    {
63
        try {
64
            return $this->definitionResolver->resolve($value);
65
        } catch (DependencyException $e) {
66
            throw $e;
67
        } catch (Exception $e) {
68
            throw new DependencyException(sprintf(
69
                'Error while resolving %s[%s]. %s',
70
                $definition->getName(),
71
                $key,
72
                $e->getMessage()
73
            ), 0, $e);
74
        }
75
    }
76
}