Skip to content

Commit 940914b

Browse files
Merge branch 'bugfix/discriminator-base-class'
2 parents 9890aa3 + 834b3ff commit 940914b

4 files changed

+46
-38
lines changed

src/JMS/Serializer/Metadata/ClassMetadata.php

+42-34
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ public function setDiscriminator($fieldName, array $map, array $groups = array()
7777
$this->discriminatorFieldName = $fieldName;
7878
$this->discriminatorMap = $map;
7979
$this->discriminatorGroups = $groups;
80+
81+
$this->setDiscriminatorProperty();
8082
}
8183

8284
/**
@@ -183,40 +185,7 @@ public function merge(MergeableInterface $object)
183185
$this->discriminatorBaseClass = $object->discriminatorBaseClass;
184186
}
185187

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();
220189

221190
$this->sortProperties();
222191
}
@@ -313,6 +282,45 @@ public function unserialize($str)
313282
parent::unserialize($parentStr);
314283
}
315284

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+
316324
private function sortProperties()
317325
{
318326
switch ($this->accessorOrder) {

tests/Fixtures/Discriminator/ObjectWithXmlAttributeDiscriminatorParent.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* })
2727
* @Serializer\XmlDiscriminator(attribute=true, cdata=false)
2828
*/
29-
class ObjectWithXmlAttributeDiscriminatorParent
29+
abstract class ObjectWithXmlAttributeDiscriminatorParent
3030
{
3131

32-
}
32+
}

tests/Fixtures/Discriminator/ObjectWithXmlNamespaceDiscriminatorParent.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* @Serializer\XmlDiscriminator(namespace="http://example.com/", cdata=false)
2828
* @Serializer\XmlNamespace(prefix="foo", uri="http://example.com/")
2929
*/
30-
class ObjectWithXmlNamespaceDiscriminatorParent
30+
abstract class ObjectWithXmlNamespaceDiscriminatorParent
3131
{
3232

3333
}

tests/Fixtures/Discriminator/ObjectWithXmlNotCDataDiscriminatorParent.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* })
2727
* @Serializer\XmlDiscriminator(cdata=false)
2828
*/
29-
class ObjectWithXmlNotCDataDiscriminatorParent
29+
abstract class ObjectWithXmlNotCDataDiscriminatorParent
3030
{
3131

3232
}

0 commit comments

Comments
 (0)