@@ -77,6 +77,8 @@ public function setDiscriminator($fieldName, array $map, array $groups = array()
77
77
$ this ->discriminatorFieldName = $ fieldName ;
78
78
$ this ->discriminatorMap = $ map ;
79
79
$ this ->discriminatorGroups = $ groups ;
80
+
81
+ $ this ->setDiscriminatorProperty ();
80
82
}
81
83
82
84
/**
@@ -183,40 +185,7 @@ public function merge(MergeableInterface $object)
183
185
$ this ->discriminatorBaseClass = $ object ->discriminatorBaseClass ;
184
186
}
185
187
186
- if ($ this ->discriminatorMap && !$ this ->reflection ->isAbstract ()) {
187
- if (false === $ typeValue = array_search ($ this ->name , $ this ->discriminatorMap , true )) {
188
- throw new \LogicException (sprintf (
189
- 'The sub-class "%s" is not listed in the discriminator of the base class "%s". ' ,
190
- $ this ->name ,
191
- $ this ->discriminatorBaseClass
192
- ));
193
- }
194
-
195
- $ this ->discriminatorValue = $ typeValue ;
196
-
197
- if (isset ($ this ->propertyMetadata [$ this ->discriminatorFieldName ])
198
- && !$ this ->propertyMetadata [$ this ->discriminatorFieldName ] instanceof StaticPropertyMetadata
199
- ) {
200
- throw new \LogicException (sprintf (
201
- 'The discriminator field name "%s" of the base-class "%s" conflicts with a regular property of the sub-class "%s". ' ,
202
- $ this ->discriminatorFieldName ,
203
- $ this ->discriminatorBaseClass ,
204
- $ this ->name
205
- ));
206
- }
207
-
208
- $ discriminatorProperty = new StaticPropertyMetadata (
209
- $ this ->name ,
210
- $ this ->discriminatorFieldName ,
211
- $ typeValue ,
212
- $ this ->discriminatorGroups
213
- );
214
- $ discriminatorProperty ->serializedName = $ this ->discriminatorFieldName ;
215
- $ discriminatorProperty ->xmlAttribute = $ this ->xmlDiscriminatorAttribute ;
216
- $ discriminatorProperty ->xmlElementCData = $ this ->xmlDiscriminatorCData ;
217
- $ discriminatorProperty ->xmlNamespace = $ this ->xmlDiscriminatorNamespace ;
218
- $ this ->propertyMetadata [$ this ->discriminatorFieldName ] = $ discriminatorProperty ;
219
- }
188
+ $ this ->setDiscriminatorProperty ();
220
189
221
190
$ this ->sortProperties ();
222
191
}
@@ -313,6 +282,45 @@ public function unserialize($str)
313
282
parent ::unserialize ($ parentStr );
314
283
}
315
284
285
+ private function setDiscriminatorProperty ()
286
+ {
287
+ if ($ this ->discriminatorMap && !$ this ->reflection ->isAbstract () && !$ this ->reflection ->isInterface ()) {
288
+ if (false === $ typeValue = array_search ($ this ->name , $ this ->discriminatorMap , true )) {
289
+ throw new \LogicException (sprintf (
290
+ 'The sub-class "%s" is not listed in the discriminator of the base class "%s". ' ,
291
+ $ this ->name ,
292
+ $ this ->discriminatorBaseClass
293
+ ));
294
+ }
295
+
296
+ $ this ->discriminatorValue = $ typeValue ;
297
+
298
+ if (isset ($ this ->propertyMetadata [$ this ->discriminatorFieldName ])
299
+ && !$ this ->propertyMetadata [$ this ->discriminatorFieldName ] instanceof StaticPropertyMetadata
300
+ ) {
301
+ throw new \LogicException (sprintf (
302
+ 'The discriminator field name "%s" of the base-class "%s" conflicts with a regular property of the sub-class "%s". ' ,
303
+ $ this ->discriminatorFieldName ,
304
+ $ this ->discriminatorBaseClass ,
305
+ $ this ->name
306
+ ));
307
+ }
308
+
309
+ $ discriminatorProperty = new StaticPropertyMetadata (
310
+ $ this ->name ,
311
+ $ this ->discriminatorFieldName ,
312
+ $ typeValue ,
313
+ $ this ->discriminatorGroups
314
+ );
315
+ $ discriminatorProperty ->serializedName = $ this ->discriminatorFieldName ;
316
+ $ discriminatorProperty ->xmlAttribute = $ this ->xmlDiscriminatorAttribute ;
317
+ $ discriminatorProperty ->xmlElementCData = $ this ->xmlDiscriminatorCData ;
318
+ $ discriminatorProperty ->xmlNamespace = $ this ->xmlDiscriminatorNamespace ;
319
+ $ this ->propertyMetadata [$ this ->discriminatorFieldName ] = $ discriminatorProperty ;
320
+ }
321
+
322
+ }
323
+
316
324
private function sortProperties ()
317
325
{
318
326
switch ($ this ->accessorOrder ) {
0 commit comments