1
+ <?php
2
+
3
+ namespace Cspray \AnnotatedInjector ;
4
+
5
+ use JsonSerializable ;
6
+
7
+ class InjectorDefinitionSerializer {
8
+
9
+ public function serialize (InjectorDefinition $ injectorDefinition ) : JsonSerializable {
10
+ return new class ($ injectorDefinition ) implements JsonSerializable {
11
+
12
+ private InjectorDefinition $ injectorDefinition ;
13
+
14
+ public function __construct (InjectorDefinition $ injectorDefinition ) {
15
+ $ this ->injectorDefinition = $ injectorDefinition ;
16
+ }
17
+
18
+ public function jsonSerialize () {
19
+ $ compiledServiceDefinitions = [];
20
+ $ addCompiledServiceDefinition = function (string $ key , ServiceDefinition $ serviceDefinition ) use (&$ compiledServiceDefinitions , &$ addCompiledServiceDefinition ) : void {
21
+ if (!isset ($ compiledServiceDefinitions [$ key ])) {
22
+ $ implementedServices = [];
23
+ foreach ($ serviceDefinition ->getImplementedServices () as $ implementedService ) {
24
+ $ implementedKey = md5 ($ implementedService ->getType ());
25
+ $ addCompiledServiceDefinition ($ implementedKey , $ implementedService );
26
+ $ implementedServices [] = $ implementedKey ;
27
+ }
28
+
29
+ $ extendedServices = [];
30
+ foreach ($ serviceDefinition ->getExtendedServices () as $ extendedService ) {
31
+ $ extendedKey = md5 ($ extendedService ->getType ());
32
+ $ addCompiledServiceDefinition ($ extendedKey , $ extendedService );
33
+ $ extendedServices [] = $ extendedKey ;
34
+ }
35
+
36
+ $ compiledServiceDefinitions [$ key ] = [
37
+ 'type ' => $ serviceDefinition ->getType (),
38
+ 'implementedServices ' => $ implementedServices ,
39
+ 'extendedServices ' => $ extendedServices ,
40
+ 'environments ' => $ serviceDefinition ->getEnvironments (),
41
+ 'isInterface ' => $ serviceDefinition ->isInterface (),
42
+ 'isClass ' => $ serviceDefinition ->isClass (),
43
+ 'isAbstract ' => $ serviceDefinition ->isAbstract ()
44
+ ];
45
+ }
46
+ };
47
+ $ serviceDefinitions = [];
48
+ foreach ($ this ->injectorDefinition ->getSharedServiceDefinitions () as $ serviceDefinition ) {
49
+ $ key = md5 ($ serviceDefinition ->getType ());
50
+ $ addCompiledServiceDefinition ($ key , $ serviceDefinition );
51
+ $ serviceDefinitions [] = $ key ;
52
+ }
53
+
54
+ $ aliasDefinitions = [];
55
+ foreach ($ this ->injectorDefinition ->getAliasDefinitions () as $ aliasDefinition ) {
56
+ $ originalKey = md5 ($ aliasDefinition ->getOriginalServiceDefinition ()->getType ());
57
+ $ addCompiledServiceDefinition ($ originalKey , $ aliasDefinition ->getOriginalServiceDefinition ());
58
+ $ aliasKey = md5 ($ aliasDefinition ->getAliasServiceDefinition ()->getType ());
59
+ $ addCompiledServiceDefinition ($ aliasKey , $ aliasDefinition ->getAliasServiceDefinition ());
60
+ $ aliasDefinitions [] = [
61
+ 'original ' => $ originalKey ,
62
+ 'alias ' => $ aliasKey
63
+ ];
64
+ }
65
+
66
+ $ servicePrepareDefinitions = [];
67
+ foreach ($ this ->injectorDefinition ->getServicePrepareDefinitions () as $ servicePrepareDefinition ) {
68
+ $ servicePrepareDefinitions [] = [
69
+ 'type ' => $ servicePrepareDefinition ->getType (),
70
+ 'method ' => $ servicePrepareDefinition ->getMethod ()
71
+ ];
72
+ }
73
+
74
+ $ useScalarDefinitions = [];
75
+ foreach ($ this ->injectorDefinition ->getUseScalarDefinitions () as $ useScalarDefinition ) {
76
+ $ useScalarDefinitions [] = [
77
+ 'type ' => $ useScalarDefinition ->getType (),
78
+ 'method ' => $ useScalarDefinition ->getMethod (),
79
+ 'paramName ' => $ useScalarDefinition ->getParamName (),
80
+ 'paramType ' => $ useScalarDefinition ->getParamType (),
81
+ 'value ' => $ useScalarDefinition ->getValue ()
82
+ ];
83
+ }
84
+
85
+ $ useServiceDefinitions = [];
86
+ foreach ($ this ->injectorDefinition ->getUseServiceDefinitions () as $ useServiceDefinition ) {
87
+ $ useServiceDefinitions [] = [
88
+ 'type ' => $ useServiceDefinition ->getType (),
89
+ 'method ' => $ useServiceDefinition ->getMethod (),
90
+ 'paramName ' => $ useServiceDefinition ->getParamName (),
91
+ 'paramType ' => $ useServiceDefinition ->getParamType (),
92
+ 'value ' => $ useServiceDefinition ->getValue ()
93
+ ];
94
+ }
95
+
96
+ $ serviceDelegateDefinitions = [];
97
+ foreach ($ this ->injectorDefinition ->getServiceDelegateDefinitions () as $ serviceDelegateDefinition ) {
98
+ $ serviceDelegateDefinitions [] = [
99
+ 'delegateType ' => $ serviceDelegateDefinition ->getDelegateType (),
100
+ 'delegateMethod ' => $ serviceDelegateDefinition ->getDelegateMethod (),
101
+ 'serviceType ' => $ serviceDelegateDefinition ->getServiceType ()
102
+ ];
103
+ }
104
+
105
+ return [
106
+ 'compiledServiceDefinitions ' => $ compiledServiceDefinitions ,
107
+ 'sharedServiceDefinitions ' => $ serviceDefinitions ,
108
+ 'aliasDefinitions ' => $ aliasDefinitions ,
109
+ 'servicePrepareDefinitions ' => $ servicePrepareDefinitions ,
110
+ 'useScalarDefinitions ' => $ useScalarDefinitions ,
111
+ 'useServiceDefinitions ' => $ useServiceDefinitions ,
112
+ 'serviceDelegateDefinitions ' => $ serviceDelegateDefinitions
113
+ ];
114
+ }
115
+ };
116
+ }
117
+
118
+ public function deserialize (string $ json ) : InjectorDefinition {
119
+ $ data = json_decode ($ json , true );
120
+
121
+ $ serviceDefinitions = [];
122
+ foreach ($ data ['compiledServiceDefinitions ' ] as $ serviceHash => $ compiledServiceDefinition ) {
123
+ $ serviceDefinitions [$ serviceHash ] = new ServiceDefinition (
124
+ $ compiledServiceDefinition ['type ' ],
125
+ [],
126
+ $ compiledServiceDefinition ['implementedServices ' ],
127
+ $ compiledServiceDefinition ['extendedServices ' ],
128
+ $ compiledServiceDefinition ['isInterface ' ],
129
+ $ compiledServiceDefinition ['isAbstract ' ]
130
+ );
131
+ }
132
+
133
+ $ sharedServiceDefinitions = [];
134
+ foreach ($ data ['sharedServiceDefinitions ' ] as $ serviceHash ) {
135
+ $ sharedServiceDefinitions [] = $ serviceDefinitions [$ serviceHash ];
136
+ }
137
+
138
+ $ aliasDefinitions = [];
139
+ foreach ($ data ['aliasDefinitions ' ] as $ aliasDefinition ) {
140
+ $ aliasDefinitions [] = new AliasDefinition (
141
+ $ serviceDefinitions [$ aliasDefinition ['original ' ]],
142
+ $ serviceDefinitions [$ aliasDefinition ['alias ' ]]
143
+ );
144
+ }
145
+
146
+ $ servicePrepareDefinitions = [];
147
+ foreach ($ data ['servicePrepareDefinitions ' ] as $ servicePrepareDefinition ) {
148
+ $ servicePrepareDefinitions [] = new ServicePrepareDefinition (
149
+ $ servicePrepareDefinition ['type ' ],
150
+ $ servicePrepareDefinition ['method ' ]
151
+ );
152
+ }
153
+
154
+ $ useScalarDefinitions = [];
155
+ foreach ($ data ['useScalarDefinitions ' ] as $ useScalarDefinition ) {
156
+ $ useScalarDefinitions [] = new UseScalarDefinition (
157
+ $ useScalarDefinition ['type ' ],
158
+ $ useScalarDefinition ['method ' ],
159
+ $ useScalarDefinition ['paramName ' ],
160
+ $ useScalarDefinition ['paramType ' ],
161
+ $ useScalarDefinition ['value ' ]
162
+ );
163
+ }
164
+
165
+ $ useServiceDefinitions = [];
166
+ foreach ($ data ['useServiceDefinitions ' ] as $ useServiceDefinition ) {
167
+ $ useServiceDefinitions [] = new UseServiceDefinition (
168
+ $ useServiceDefinition ['type ' ],
169
+ $ useServiceDefinition ['method ' ],
170
+ $ useServiceDefinition ['paramName ' ],
171
+ $ useServiceDefinition ['paramType ' ],
172
+ $ useServiceDefinition ['value ' ]
173
+ );
174
+ }
175
+
176
+ $ serviceDelegateDefinitions = [];
177
+ foreach ($ data ['serviceDelegateDefinitions ' ] as $ serviceDelegateDefinition ) {
178
+ $ serviceDelegateDefinitions [] = new ServiceDelegateDefinition (
179
+ $ serviceDelegateDefinition ['delegateType ' ],
180
+ $ serviceDelegateDefinition ['delegateMethod ' ],
181
+ $ serviceDelegateDefinition ['serviceType ' ]
182
+ );
183
+ }
184
+
185
+ return new class ($ sharedServiceDefinitions , $ aliasDefinitions , $ servicePrepareDefinitions , $ useScalarDefinitions , $ useServiceDefinitions , $ serviceDelegateDefinitions ) implements InjectorDefinition {
186
+
187
+ public function __construct (
188
+ private array $ sharedServiceDefinitions ,
189
+ private array $ aliasDefinitions ,
190
+ private array $ servicePrepareDefinitions ,
191
+ private array $ useScalarDefinitions ,
192
+ private array $ useServiceDefinitions ,
193
+ private array $ serviceDelegateDefinitions
194
+ ) {}
195
+
196
+ public function getSharedServiceDefinitions (): array {
197
+ return $ this ->sharedServiceDefinitions ;
198
+ }
199
+
200
+ public function getAliasDefinitions (): array {
201
+ return $ this ->aliasDefinitions ;
202
+ }
203
+
204
+ public function getServicePrepareDefinitions (): array {
205
+ return $ this ->servicePrepareDefinitions ;
206
+ }
207
+
208
+ public function getUseScalarDefinitions (): array {
209
+ return $ this ->useScalarDefinitions ;
210
+ }
211
+
212
+ public function getUseServiceDefinitions (): array {
213
+ return $ this ->useServiceDefinitions ;
214
+ }
215
+
216
+ public function getServiceDelegateDefinitions (): array {
217
+ return $ this ->serviceDelegateDefinitions ;
218
+ }
219
+ };
220
+ }
221
+
222
+ }
0 commit comments