我正在使用JMSSerializer - 以及Doctrine構造函數 - 爲了反序列化發送的對象。當使用JMSSerializerBundle反序列化時如何使屬性「合併」或初始化
我的(簡化)實體如下。我忽略我認爲的代碼是沒用的:
Widget
{
protected $id;
/**
* @ORM\OneToMany(
* targetEntity="Belka\Iso50k1Bundle\Entity\VarSelection",
* mappedBy="widget",
* cascade={"persist", "remove", "detach", "merge"})
* @Serializer\Groups({"o-all-getCWidget", "i-p2-create", "o-all-getWidget", "i-p3-create", "i-p2-editWidget"})
* @Type("ArrayCollection<Belka\Iso50k1Bundle\Entity\VarSelection>")
*/
protected $varsSelection;
}
/**
* @ORM\Entity()
*
* @ORM\InheritanceType("SINGLE_TABLE")
*
* @ORM\DiscriminatorColumn(
* name="vartype",
* type="string")
*
* @ORM\DiscriminatorMap({
* "PHY" = "PhyVarSelection"
* })
*
* @ORM\HasLifecycleCallbacks()
*/
abstract class VarSelection
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue("SEQUENCE")
* @Serializer\groups({"o-all-getCWidget", "o-all-getWidget", "i-p2-editWidget"})
*/
protected $id;
}
class PhyVarSelection extends VarSelection
{
/**
* @var PhyVar
*
* @ORM\ManyToOne(
* targetEntity="Belka\Iso50k1Bundle\Entity\PhyVar",
* cascade={"persist", "merge", "detach"})
*
* @ORM\JoinColumn(
* name="phy_var_sel",
* referencedColumnName="id",
* nullable=false)
*/
protected $phyVar;
}
class PhyVar extends Variable
{
/**
* @ORM\Column(type="string")
* @ORM\Id
*
* @Serializer\Groups({"o-p2-getCMeters", "o-all-getWidget"})
* @Assert\Regex("/(PHY)_\d+_\d+_\w+/")
*/
protected $id;
/**
* @ORM\Column(type="text", name="varname")
* @Serializer\Groups({"o-p2-getCMeters", "o-all-getWidget", "o-all-getCWidget"})
*/
protected $varName;
...
}
我嘗試反序列化表示Widget
實體已經持續存在,與沿對象varselection
數組用自己id
規定 - 如果已經堅持 - 不和他們擁有id
如果他們是新的並且被持續。
反序列化工作:
$context = new DeserializationContext();
$context->setGroups('i-p2-editWidget');
$data = $this->serializer->deserialize($content, $FQCN, 'json', $context);
但$data
始終Widget::$varsSelection[]::$phyVar
作爲初始化的代理類,只有id
正確設置。我必須這樣做才能擁有這一切:
foreach ($data->getVarsSelection() as $varSel) {
$varSel->getVar();
}
這是爲什麼?它如何能夠初始化?我不想花時間循環再次從DB獲取數據。
編輯