Я хочу сериализовать и десериализовать объект с его зависимостями, но я не могу сериализовать элементы, относящиеся к абстрактному классу.
Иерархия:
Тест -> несколько Calls
, где класс Call
является абстрактным классом и расширяется с помощью TestCallExecuteQuery
(та же проблема с $conditions
)
Test.php:
/**
* @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
* @ORM\Table(name="cfa_test")
* @JMSSer\ExclusionPolicy("all")
*/
class Test
{
/**
* @ORM\OneToMany(targetEntity="TestCall", mappedBy="test", cascade={"all"}, orphanRemoval=true)
* @JMSSer\Expose
* @JMSSer\Groups({"export"})
* @JMSSer\Type("ArrayCollection<App\Bundle\CapFileAnalyzerBundle\Entity\TestCall>")
*/
protected $calls;
/**
* @ORM\OneToMany(targetEntity="TestCondition", mappedBy="test", cascade={"all"}, orphanRemoval=true)
* @JMSSer\Expose
* @JMSSer\Groups({"export"})
* @JMSSer\Type("ArrayCollection<App\Bundle\CapFileAnalyzerBundle\Entity\TestCondition>")
*/
protected $conditions;
TestCall.php:
/**
* @ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\Table(name="cfa_test_call")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({
* "executeQuery" = "App\Bundle\CapFileAnalyzerBundle\Entity\TestCallExecuteQuery",
* "call" = "App\Bundle\CapFileAnalyzerBundle\Entity\TestCall"
* })
* @JMSSer\ExclusionPolicy("all")
* @JMSSer\Discriminator(field="serializedType", map={
* "executeQuery"="App\Bundle\CapFileAnalyzerBundle\Entity\TestCallExecuteQuery",
* "call" = "App\Bundle\CapFileAnalyzerBundle\Entity\TestCall"
* })
*/
abstract class TestCall
{
/**
* @JMSSer\Expose
* @JMSSer\Groups({"export"})
*/
protected $type = 'call';
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Test", inversedBy="calls")
*/
protected $test;
/**
* @JMSSer\VirtualProperty()
* @JMSSer\SerializedName("serializedType")
*/
public function getDiscr()
{
return $this->type;
}
TestCallExecuteQuery.php:
/**
* @ORM\Entity
* @JMSSer\ExclusionPolicy("all")
*/
class TestCallExecuteQuery extends TestCall
{
protected $type = 'executeQuery';
/**
* @ORM\Column(name="`query`", type="text")
* @JMSSer\Expose
* @JMSSer\Groups({"export"})
*/
protected $query;
/**
* @ORM\Column(name="`return`", type="string", nullable=true)
* @JMSSer\Expose
* @JMSSer\Groups({"export"})
*/
protected $return;
Поэтому я следовал инструкциям, найденным в Интернете:
@JMSSer\Expose
аннотация с@JMSSer\ExclusionPolicy("all")
в каждом классе@JMSSer\Discriminator
аннотация поверх абстрактного классаTestCall
для сопоставления с классом-расширителем (TestcallExecuteQuery
)
Но.. Когда я сериализую, я получаю только свойство типа TestCall, но не свойство query
или return
, определенное в TestCallExecuteQuery
:
{"tests":[{"calls":[{"type":"executeQuery"},{"type":"executeQuery"}], ... }
Я знаю, что это возможно, потому что я получил их ОДИН РАЗ, но я не смог воспроизвести это, даже повернув время вспять..
{"tests":[{"calls":[{"query":"SELECT * FROM table","return":"return_1"}], ... }
ИЗМЕНИТЬ:
Хорошо, я, вероятно, получил query
и return
, изменив Test.php
:
/**
* @JMSSer\Type("ArrayCollection<App\Bundle\CapFileAnalyzerBundle\Entity\TestCall>")
*/
protected $calls;
To :
/**
* @JMSSer\Type("ArrayCollection<App\Bundle\CapFileAnalyzerBundle\Entity\TestCallExecuteQuery>")
*/
protected $calls;
Что я делаю не так ?