/
RouterParametersResolver.php
81 lines (63 loc) · 2.39 KB
/
RouterParametersResolver.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
namespace Centum\Container\Resolver;
use Centum\Container\Exception\UnresolvableParameterException;
use Centum\Interfaces\Container\ParameterInterface;
use Centum\Interfaces\Container\ResolverInterface;
use Centum\Interfaces\Http\FormInterface;
use Centum\Interfaces\Router\ControllerInterface;
use Centum\Interfaces\Router\ParametersInterface;
class RouterParametersResolver implements ResolverInterface
{
public function __construct(
protected readonly ParametersInterface $parameters
) {
}
/**
* @throws UnresolvableParameterException
*/
public function resolve(ParameterInterface $parameter): mixed
{
if (!$parameter->hasDeclaringClass() || !is_subclass_of($parameter->getDeclaringClass(), ControllerInterface::class)) {
throw new UnresolvableParameterException($parameter);
}
if ($parameter->hasType() && is_subclass_of($parameter->getType(), FormInterface::class)) {
throw new UnresolvableParameterException($parameter);
}
if (!$parameter->hasName()) {
throw new UnresolvableParameterException($parameter);
}
$name = $parameter->getName();
if (!$this->parameters->has($name)) {
throw new UnresolvableParameterException($parameter);
}
/** @var mixed */
$value = $this->parameters->get($name);
if ($value === null) {
if ($parameter->hasDefaultValue()) {
return $parameter->getDefaultValue();
}
if ($parameter->allowsNull()) {
return null;
}
throw new UnresolvableParameterException($parameter);
} elseif (is_object($value)) {
/** @var class-string */
$typeName = $parameter->getType();
if (!is_a($value, $typeName) && !is_subclass_of($value, $typeName)) {
throw new UnresolvableParameterException($parameter);
}
} else {
$valueType = gettype($value);
$valueType = match ($valueType) {
"boolean" => "bool",
"double" => "float",
"integer" => "int",
default => $valueType,
};
if ($parameter->getType() !== $valueType) {
throw new UnresolvableParameterException($parameter);
}
}
return $value;
}
}