Repository navigation
Expand file tree
/
Copy pathAbstractCallableDefinitionCollector.php
More file actions
59 lines (54 loc) · 1.82 KB
/
Copy pathAbstractCallableDefinitionCollector.php
File metadata and controls
59 lines (54 loc) · 1.82 KB
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
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact [email protected]
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\Di;
use ReflectionAttribute;
use ReflectionNamedType;
use ReflectionParameter;
use ReflectionUnionType;
abstract class AbstractCallableDefinitionCollector extends MetadataCollector
{
/**
* @param array<ReflectionParameter> $parameters
*/
protected function getDefinitionsFromParameters(array $parameters): array
{
$definitions = [];
foreach ($parameters as $parameter) {
$definitions[] = $this->createType(
$parameter->getName(),
$parameter->getType(),
$parameter->allowsNull(),
$parameter->isDefaultValueAvailable(),
$parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null,
$parameter->getAttributes()
);
}
return $definitions;
}
/**
* @param ReflectionAttribute[] $attributes
*/
protected function createType(string $name, ?\ReflectionType $type, bool $allowsNull, bool $hasDefault = false, mixed $defaultValue = null, array $attributes = []): ReflectionType
{
// TODO: Support ReflectionUnionType.
$typeName = match (true) {
$type instanceof ReflectionNamedType => $type->getName(),
$type instanceof ReflectionUnionType => $type->getTypes()[0]->getName(),
default => 'mixed'
};
return new ReflectionType($typeName, $allowsNull, [
'defaultValueAvailable' => $hasDefault,
'defaultValue' => $defaultValue,
'name' => $name,
'attributes' => $attributes,
]);
}
}