-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathAttributeTrait.php
More file actions
88 lines (72 loc) · 3.31 KB
/
AttributeTrait.php
File metadata and controls
88 lines (72 loc) · 3.31 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
declare(strict_types=1);
namespace Picamator\TransferObject\Transfer\Attribute;
use Picamator\TransferObject\Transfer\Attribute\Initiator\InitiatorAttributeInterface;
use Picamator\TransferObject\Transfer\Attribute\Transformer\TransformerAttributeInterface;
use Picamator\TransferObject\Transfer\Exception\AttributeTransferException;
use ReflectionAttribute;
use ReflectionClassConstant;
trait AttributeTrait
{
/**
* @var array<string, TransformerAttributeInterface|InitiatorAttributeInterface>
*/
private static array $_attributeCache = [];
protected function getInitiatorAttribute(string $constantName): InitiatorAttributeInterface
{
/** @var \ReflectionAttribute<InitiatorAttributeInterface> $reflectionAttribute */
$reflectionAttribute = $this->getConstantReflection(
constantName: $constantName,
attributeName: InitiatorAttributeInterface::class,
);
/** @var InitiatorAttributeInterface $attributeInstance */
$attributeInstance = $this->getAttributeInstance($reflectionAttribute);
return $attributeInstance;
}
/**
* @throws \Picamator\TransferObject\Transfer\Exception\AttributeTransferException
*/
protected function getTransformerAttribute(string $constantName): TransformerAttributeInterface
{
/** @var \ReflectionAttribute<TransformerAttributeInterface> $reflectionAttribute */
$reflectionAttribute = $this->getConstantReflection(
constantName: $constantName,
attributeName: TransformerAttributeInterface::class,
);
/** @var TransformerAttributeInterface $attributeInstance */
$attributeInstance = $this->getAttributeInstance($reflectionAttribute);
return $attributeInstance;
}
/**
* @param \ReflectionAttribute<TransformerAttributeInterface|InitiatorAttributeInterface> $reflectionAttribute
*/
private function getAttributeInstance(
ReflectionAttribute $reflectionAttribute,
): TransformerAttributeInterface|InitiatorAttributeInterface {
if (\count($reflectionAttribute->getArguments()) !== 0) {
return $reflectionAttribute->newInstance();
}
$attributeName = $reflectionAttribute->getName();
self::$_attributeCache[$attributeName] ??= $reflectionAttribute->newInstance();
return self::$_attributeCache[$attributeName];
}
/**
* @return \ReflectionAttribute<TransformerAttributeInterface|InitiatorAttributeInterface>
*/
private function getConstantReflection(string $constantName, string $attributeName): ReflectionAttribute
{
$reflectionConstant = new ReflectionClassConstant($this, $constantName);
$reflectionAttributes = $reflectionConstant->getAttributes(
name: $attributeName,
flags: ReflectionAttribute::IS_INSTANCEOF,
);
/** @var \ReflectionAttribute<TransformerAttributeInterface|InitiatorAttributeInterface>|null $firstReflectionAttribute */
$firstReflectionAttribute = $reflectionAttributes[0] ?? null;
if ($firstReflectionAttribute === null) {
throw new AttributeTransferException(
\sprintf('Attribute "%s" not found for constant "%s".', $constantName, $attributeName),
);
}
return $firstReflectionAttribute;
}
}