-
Notifications
You must be signed in to change notification settings - Fork 574
Expand file tree
/
Copy pathAutowiredAttributeServicesExtension.php
More file actions
67 lines (56 loc) · 1.87 KB
/
AutowiredAttributeServicesExtension.php
File metadata and controls
67 lines (56 loc) · 1.87 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
<?php declare(strict_types = 1);
namespace PHPStan\DependencyInjection;
use Nette\DI\CompilerExtension;
use Nette\DI\Definitions\Reference;
use Nette\DI\Helpers;
use Nette\Utils\Strings;
use olvlvl\ComposerAttributeCollector\Attributes;
use ReflectionClass;
use function strtolower;
use function substr;
final class AutowiredAttributeServicesExtension extends CompilerExtension
{
public function loadConfiguration(): void
{
require_once __DIR__ . '/../../vendor/attributes.php';
$autowiredServiceClasses = Attributes::findTargetClasses(AutowiredService::class);
$builder = $this->getContainerBuilder();
$autowiredParameters = Attributes::findTargetMethodParameters(AutowiredParameter::class);
foreach ($autowiredServiceClasses as $class) {
$reflection = new ReflectionClass($class->name);
$attribute = $class->attribute;
$definition = $builder->addDefinition($attribute->name)
->setType($class->name)
->setAutowired();
foreach ($autowiredParameters as $autowiredParameter) {
if (strtolower($autowiredParameter->method) !== '__construct') {
continue;
}
if (strtolower($autowiredParameter->class) !== strtolower($class->name)) {
continue;
}
$ref = $autowiredParameter->attribute->ref;
if ($ref === null) {
$argument = Helpers::expand(
'%' . Helpers::escape($autowiredParameter->name) . '%',
$builder->parameters,
);
} elseif (Strings::match($ref, '#^@[\w\\\\]+$#D') !== null) {
$argument = new Reference(substr($ref, 1));
} else {
$argument = Helpers::expand(
$ref,
$builder->parameters,
);
}
$definition->setArgument($autowiredParameter->name, $argument);
}
foreach (ValidateServiceTagsExtension::INTERFACE_TAG_MAPPING as $interface => $tag) {
if (!$reflection->implementsInterface($interface)) {
continue;
}
$definition->addTag($tag);
}
}
}
}