This repository was archived by the owner on Nov 9, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathAutowiringCompilerPass.php
87 lines (67 loc) · 3.06 KB
/
AutowiringCompilerPass.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
82
83
84
85
86
87
<?php
namespace Kutny\AutowiringBundle;
use Kutny\AutowiringBundle\Compiler\ClassConstructorFiller;
use Kutny\AutowiringBundle\Compiler\ClassListBuilder;
use ReflectionClass;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
class AutowiringCompilerPass implements CompilerPassInterface
{
private $classConstructorFiller;
private $classListBuilder;
public function __construct(ClassConstructorFiller $classConstructorFiller, ClassListBuilder $classListBuilder)
{
$this->classConstructorFiller = $classConstructorFiller;
$this->classListBuilder = $classListBuilder;
}
public function process(ContainerBuilder $containerBuilder)
{
$classList = $this->classListBuilder->buildClassList($containerBuilder);
$serviceDefinitions = $containerBuilder->getDefinitions();
$ignoredServicesRegExp = $this->getIgnoredServicesRegExp($containerBuilder);
foreach ($serviceDefinitions as $serviceId => $definition) {
if ($definition->isAbstract() || !$definition->isPublic()) {
continue;
}
if ($definition->getClass() === null) {
continue;
}
if ($ignoredServicesRegExp && preg_match($ignoredServicesRegExp, $serviceId)) {
continue;
}
if ($this->serviceIsCreatedByFactory($definition)) {
continue;
}
$this->watchServiceClassForChanges($definition, $containerBuilder);
$reflection = new ReflectionClass($definition->getClass());
$constructor = $reflection->getConstructor();
if ($constructor !== null && $constructor->isPublic()) {
$this->classConstructorFiller->autowireParams($constructor, $serviceId, $definition, $classList);
}
}
}
private function getIgnoredServicesRegExp(ContainerBuilder $containerBuilder)
{
$ignoredServices = $containerBuilder->getParameter('kutny_autowiring.ignored_services');
if (empty($ignoredServices)) {
return null;
}
return '~^(' . implode('|', $ignoredServices) . ')$~';
}
private function serviceIsCreatedByFactory(Definition $definition)
{
return
(method_exists($definition, 'getFactoryClass') && $definition->getFactoryClass())
|| (method_exists($definition, 'getFactoryMethod') && $definition->getFactoryMethod())
|| (method_exists($definition, 'getFactory') && $definition->getFactory());
}
private function watchServiceClassForChanges(Definition $definition, ContainerBuilder $containerBuilder)
{
$classReflection = new ReflectionClass($definition->getClass());
do {
$containerBuilder->addResource(new FileResource($classReflection->getFileName()));
} while ($classReflection = $classReflection->getParentClass());
}
}