-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathProfilesAwareContainerDefinition.php
75 lines (61 loc) · 2.73 KB
/
ProfilesAwareContainerDefinition.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
<?php declare(strict_types=1);
namespace Cspray\AnnotatedContainer\Definition;
use Cspray\AnnotatedContainer\Exception\InvalidAlias;
use Cspray\AnnotatedContainer\Profiles;
use Cspray\AnnotatedContainer\Reflection\Type;
final class ProfilesAwareContainerDefinition implements ContainerDefinition {
public function __construct(
private readonly ContainerDefinition $containerDefinition,
private readonly Profiles $activeProfiles
) {
}
public function serviceDefinitions() : array {
return array_values(array_filter(
$this->containerDefinition->serviceDefinitions(),
fn(ServiceDefinition $definition) => $this->hasActiveProfile($definition)
));
}
public function aliasDefinitions() : array {
$filtered = [];
foreach ($this->containerDefinition->aliasDefinitions() as $aliasDefinition) {
$abstract = $this->getServiceDefinition($aliasDefinition->abstractService());
if ($abstract === null) {
throw InvalidAlias::fromAbstractNotService($aliasDefinition->abstractService()->name());
}
$concrete = $this->getServiceDefinition($aliasDefinition->concreteService());
if ($concrete === null) {
throw InvalidAlias::fromConcreteNotService($aliasDefinition->concreteService()->name());
}
if ($this->hasActiveProfile($abstract) && $this->hasActiveProfile($concrete)) {
$filtered[] = $aliasDefinition;
}
}
return $filtered;
}
public function servicePrepareDefinitions() : array {
return $this->containerDefinition->servicePrepareDefinitions();
}
public function serviceDelegateDefinitions() : array {
return array_values(array_filter(
$this->containerDefinition->serviceDelegateDefinitions(),
fn(ServiceDelegateDefinition $definition) => $this->hasActiveProfile($definition)
));
}
public function injectDefinitions() : array {
return array_values(array_filter(
$this->containerDefinition->injectDefinitions(),
fn(InjectDefinition $definition) => $this->hasActiveProfile($definition)
));
}
private function getServiceDefinition(Type $objectType) : ?ServiceDefinition {
foreach ($this->containerDefinition->serviceDefinitions() as $serviceDefinition) {
if ($serviceDefinition->type() === $objectType) {
return $serviceDefinition;
}
}
return null;
}
private function hasActiveProfile(ServiceDefinition|InjectDefinition|ServiceDelegateDefinition $definition) : bool {
return $this->activeProfiles->isAnyActive($definition->profiles());
}
}