1

How can one expose the discriminator in the serialized output?

The following was adapted from this example and adjusted by the XML reference.

My entities are:

namespace Fully\Qualified;
abstract class Vehicle {
    public function getId() {return $this->id;}
    public function getCommonProperty() {return $this->common_property;}
}
class Car extends Vehicle {
    public function getCarProperty() {return $this->car_property;}
}
class Moped extends Vehicle{
    public function getMopedProperty() {return $this->moped_property;}
}

Doctrine is configured as:

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="Fully\Qualified\Vehicle" table="vehicle" inheritance-type="JOINED">
    <discriminator-column name="dtype" type="string" length="255"/>
    <discriminator-map>
      <discriminator-mapping value="car" class="Fully\Qualified\Car"/>
      <discriminator-mapping value="moped" class="Fully\Qualified\Moped"/>
    </discriminator-map>
    <id name="id" type="integer" column="id">
      <generator strategy="IDENTITY"/>
    </id>
    <field name="common_property" type="string" column="common_property" length="45"/>
  </entity>
</doctrine-mapping>

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="Fully\Qualified\Car" table="car">
    <field name="car_property" type="string" column="car_property"/>
  </entity>
</doctrine-mapping>

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="Fully\Qualified\Moped" table="moped">
    <field name="moped_property" type="string" column="moped_property"/>
  </entity>
</doctrine-mapping>

My desired results are something like:

[
  {
    "id": 1,
    "commonProperty": "foo",
    "car_property": "foo",
    "dtype": "car"
  },
  {
    "id": 2,
    "commonProperty": "foo",
    "moped_property": "foo",
    "dtype": "moped"
  },
  {
    "id": 3,
    "commonProperty": "foo",
    "moped_property": "foo",
    "dtype": "moped"
  },
  {
    "id": 4,
    "commonProperty": "foo",
    "car_property": "foo",
    "dtype": "car"
  }
]

My attempt to configure the serializer is as follows, however, the discriminator (i.e. "dtype") isn't included:

<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
    <class name="Fully\Qualified\Vehicle" discriminator-field-name="dtype" discriminator-disabled="false">
        <discriminator-class value="car">Fully\Qualified\Car</discriminator-class>
        <discriminator-class value="moped">Fully\Qualified\Moped</discriminator-class>
        <discriminator-groups>
            <group>foo</group>
            <group>bar</group>
        </discriminator-groups>
        <property name="id" groups="foo, bar"/>
        <property name="common_property" groups="foo, bar"/>
        <property name="dtype" groups="foo, bar"/>
    </class>
</serializer>

<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
    <class name="Fully\Qualified\Car">
        <property name="moped_property" groups="foo, bar"/>
    </class>
</serializer>

<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
    <class name="Fully\Qualified\Moped">
        <property name="moped_property" groups="foo, bar"/>
    </class>
</serializer>

How can one expose the discriminator in the serialized output?

user1032531
  • 24,767
  • 68
  • 217
  • 387
  • an old discussion about discriminator https://stackoverflow.com/questions/33360211/how-to-select-discriminator-column-in-doctrine-2/33362703#33362703 – Matteo Mar 14 '19 at 16:17
  • The discriminator column is used by Doctrine to figure out which class to instantiate. It is not available via the usual entity class. The easiest fix is to just add it to your entities as the value will never change. The much harder approach would be to extract it from the doctrine metadata. Possible but probably not worth the effort. – Cerad Mar 14 '19 at 16:18
  • @Matteo I've read on various posts that it is possible, but will stop looking unicorns. Thanks – user1032531 Mar 14 '19 at 17:21
  • @Cerad I've done things like `$em->getClassMetadata(get_class($class))->discriminatorValue;`, but agree it is probably not work the effort and it potentially will have a performance impact for some applications. – user1032531 Mar 14 '19 at 17:24
  • You can use @Discriminator annotation. https://jmsyst.com/libs/serializer/master/reference/annotations#discriminator – Luis Cavero Martínez Apr 18 '20 at 16:35

1 Answers1

0

If exclusion groups are not used, it will be exposed by default. Unfortunately, I wish to use exclusion groups.

user1032531
  • 24,767
  • 68
  • 217
  • 387