1+ <?php
2+
3+
4+ namespace SimonMarx \Symfony \Bundles \ServiceAnnotations \Utils ;
5+
6+
7+ use App \Serializer \Normalizer \DateTimeNormalizer ;
8+ use Symfony \Component \DependencyInjection \ChildDefinition ;
9+ use Symfony \Component \DependencyInjection \ContainerBuilder ;
10+ use Symfony \Component \DependencyInjection \Definition ;
11+ use Symfony \Component \DependencyInjection \Exception \RuntimeException ;
12+
13+ trait InstanceOfInjectionTrait
14+ {
15+ private function checkDefinitionHasInstanceOfConfigurations (ContainerBuilder $ container , Definition $ definition )
16+ {
17+ $ instanceOfConditionals = $ definition ->getInstanceofConditionals ();
18+ $ autoconfiguredInstanceof = $ definition ->isAutoconfigured () ? $ container ->getAutoconfiguredInstanceof () : [];
19+
20+ if (\count ($ autoconfiguredInstanceof ) === 0 && \count ($ instanceOfConditionals ) === 0 ) {
21+ return false ;
22+ }
23+
24+ $ instanceOfClasses = \array_keys ($ autoconfiguredInstanceof );
25+
26+ if ($ definition ->getClass () === DateTimeNormalizer::class) {
27+ foreach ($ instanceOfClasses as $ instanceOfClass ) {
28+ $ rc = $ container ->getReflectionClass ($ definition ->getClass ());
29+
30+ if (
31+ (\class_exists ($ instanceOfClass ) && $ rc ->isSubclassOf ($ instanceOfClass ))
32+ || (\interface_exists ($ instanceOfClass ) && $ rc ->implementsInterface ($ instanceOfClass ))
33+ ) {
34+ return false === $ definition instanceof ChildDefinition;
35+ }
36+ }
37+ }
38+
39+ return false ;
40+ }
41+
42+ private function mergeConditionals (array $ autoconfiguredInstanceof , array $ instanceofConditionals , ContainerBuilder $ container ): array
43+ {
44+ // make each value an array of ChildDefinition
45+ $ conditionals = array_map (function ($ childDef ) {
46+ return [$ childDef ];
47+ }, $ autoconfiguredInstanceof );
48+
49+ foreach ($ instanceofConditionals as $ interface => $ instanceofDef ) {
50+ // make sure the interface/class exists (but don't validate automaticInstanceofConditionals)
51+ if (!$ container ->getReflectionClass ($ interface )) {
52+ throw new RuntimeException (sprintf ('"%s" is set as an "instanceof" conditional, but it does not exist. ' , $ interface ));
53+ }
54+
55+ if (!isset ($ autoconfiguredInstanceof [$ interface ])) {
56+ $ conditionals [$ interface ] = [];
57+ }
58+
59+ $ conditionals [$ interface ][] = $ instanceofDef ;
60+ }
61+
62+ return $ conditionals ;
63+ }
64+ }
0 commit comments