Home > database >  Sensio ParamConverter STI abstract
Sensio ParamConverter STI abstract

Time:08-02

Given an Single Table Inheritance for Location -> A and Location -> B

 * @DiscriminatorMap({
 *     "a" = "A",
 *     "b" = "B"
 * })
 * @Discriminator(field = "discr", map = {
 *     "a" = "A",
 *     "b" = "B",
 * })
abstract class Location 

In the Controller, i will send either an A or B type extending Location.

  /**
   * @Rest\Post("", name="create_l")
   * @ParamConverter("location", converter="fos_rest.request_body")
   */
  public function insert(Location $location): JsonResponse

Doctrine tells me the obvious message it cant instaniiate an abstract class, which is true but it should instead create the subtype.

If A comes in, it should be converted to A, not instantiiate Location.

Any solutions?

CodePudding user response:

You are not allowed to create an abstract entity class like that. Take a look at the docs on single table inheritance. You can see here that both classes are concrete. In your situation, it looks like you need some subclasses LocationA LocationB, etc. But to be honest, you should provide more details about your use case, because it seems you might be misusing the inheritance structure.

CodePudding user response:

So, after doing some research and testing i fixed it myself.

My core problem was that i mixed two Serializers, JMS and Symfony/Serializer. So i decided to go with the Symfony/Serializer as it enabled the creation of the subtypes of abstract classes. This is my setup:

Imports & Entity:

use Symfony\Component\Serializer\Annotation\DiscriminatorMap;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\DiscriminatorColumn;
use Doctrine\ORM\Mapping\InheritanceType;

/**
 * @ORM\Entity(repositoryClass=AbstractParent::class)
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap(typeProperty="discr", mapping = {
 *     "a"      = "App\Entity\A",
 *     "b"      = "App\Entity\B",
 * })
 * @ORM\Table(
 *    name="abstract_parent",
 * )
 */
abstract class AbstractParent extends PlaceComputable

When sending a post request to save a subtype:

/**
 * @Rest\Post("", name="create_subtype")
 * @ParamConverter("subtype", converter="fos_rest.request_body")
 */
public function insert(AbstractParent $subtype): JsonResponse
{
 // $subtype is now of Either Type 'A' or 'B'
 // depending on what 'discr' member was passed to the controller
}

Its is now also documented in the Symfony/Serializer documentation as to how convert subtypes of abstract classes.

  • Related