diff --git a/src/JMS/Serializer/Metadata/ClassMetadata.php b/src/JMS/Serializer/Metadata/ClassMetadata.php index 3d76f2563..36a101dea 100644 --- a/src/JMS/Serializer/Metadata/ClassMetadata.php +++ b/src/JMS/Serializer/Metadata/ClassMetadata.php @@ -167,6 +167,12 @@ public function merge(MergeableInterface $object) $this->discriminatorDisabled = $object->discriminatorDisabled; } + if ($object->discriminatorMap) { + $this->discriminatorFieldName = $object->discriminatorFieldName; + $this->discriminatorMap = $object->discriminatorMap; + $this->discriminatorBaseClass = $object->discriminatorBaseClass; + } + if ($this->discriminatorMap && ! $this->reflection->isAbstract()) { if (false === $typeValue = array_search($this->name, $this->discriminatorMap, true)) { throw new \LogicException(sprintf( diff --git a/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Base.php b/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Base.php new file mode 100644 index 000000000..8091c36ae --- /dev/null +++ b/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Base.php @@ -0,0 +1,25 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DiscriminatorMiddle; + + +abstract class Base +{ + +} \ No newline at end of file diff --git a/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Chief.php b/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Chief.php new file mode 100644 index 000000000..9be1458b4 --- /dev/null +++ b/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Chief.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DiscriminatorMiddle; + +class Chief extends User +{ +} diff --git a/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Employee.php b/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Employee.php new file mode 100644 index 000000000..153a62f7b --- /dev/null +++ b/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/Employee.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DiscriminatorMiddle; + +class Employee extends User +{ +} diff --git a/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/User.php b/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/User.php new file mode 100644 index 000000000..4517fe2b0 --- /dev/null +++ b/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorMiddle/User.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DiscriminatorMiddle; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\Discriminator(field = "type", map = { + * "chief": "JMS\Serializer\Tests\Fixtures\DiscriminatorMiddle\Chief", + * "employee": "JMS\Serializer\Tests\Fixtures\DiscriminatorMiddle\Employee", + * }) + */ +abstract class User extends Base +{ + /** @Serializer\Type("integer") */ + public $hours; + + public function __construct($hours) + { + $this->hours = (integer) $hours; + } +} diff --git a/tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php b/tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php index 2ff38c9d7..18b598ab6 100644 --- a/tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php +++ b/tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php @@ -102,6 +102,8 @@ use JMS\Serializer\Exclusion\DepthExclusionStrategy; use JMS\Serializer\Tests\Fixtures\Node; use JMS\Serializer\Tests\Fixtures\AuthorReadOnlyPerClass; +use JMS\Serializer\Tests\Fixtures\DiscriminatorMiddle\Chief; +use JMS\Serializer\Tests\Fixtures\DiscriminatorMiddle\Employee; abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase { @@ -951,6 +953,28 @@ public function testNestedPolymorphicObjects() } } + /** + * @group polymorphic + */ + public function testNestedMiddlePolymorphicObjects() + { + $garage = array(new Chief(3), new Employee(1)); + $this->assertEquals( + $this->getContent('user_hierarchy'), + $this->serialize($garage) + ); + + if ($this->hasDeserializer()) { + $this->assertEquals( + $garage, + $this->deserialize( + $this->getContent('user_hierarchy'), + 'array' + ) + ); + } + } + /** * @group polymorphic */ diff --git a/tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php b/tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php index 401ff101b..0115c4790 100644 --- a/tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php +++ b/tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php @@ -97,6 +97,7 @@ protected function getContent($key) $outputs['car'] = '{"km":5,"type":"car"}'; $outputs['car_without_type'] = '{"km":5}'; $outputs['garage'] = '{"vehicles":[{"km":3,"type":"car"},{"km":1,"type":"moped"}]}'; + $outputs['user_hierarchy'] = '[{"hours":3,"type":"chief"},{"hours":1,"type":"employee"}]'; $outputs['tree'] = '{"tree":{"children":[{"children":[{"children":[],"foo":"bar"}],"foo":"bar"}],"foo":"bar"}}'; $outputs['nullable_arrays'] = '{"empty_inline":[],"not_empty_inline":["not_empty_inline"],"empty_not_inline":[],"not_empty_not_inline":["not_empty_not_inline"],"empty_not_inline_skip":[],"not_empty_not_inline_skip":["not_empty_not_inline_skip"]}'; $outputs['object_with_object_property_no_array_to_author'] = '{"foo": "bar", "author": "baz"}'; diff --git a/tests/JMS/Serializer/Tests/Serializer/xml/user_hierarchy.xml b/tests/JMS/Serializer/Tests/Serializer/xml/user_hierarchy.xml new file mode 100644 index 000000000..c3f337846 --- /dev/null +++ b/tests/JMS/Serializer/Tests/Serializer/xml/user_hierarchy.xml @@ -0,0 +1,11 @@ + + + + 3 + + + + 1 + + + diff --git a/tests/JMS/Serializer/Tests/Serializer/yml/user_hierarchy.yml b/tests/JMS/Serializer/Tests/Serializer/yml/user_hierarchy.yml new file mode 100644 index 000000000..864ccfece --- /dev/null +++ b/tests/JMS/Serializer/Tests/Serializer/yml/user_hierarchy.yml @@ -0,0 +1,6 @@ +- + hours: 3 + type: chief +- + hours: 1 + type: employee