CatchableFatalError 提交嵌入表单以持久化实体(传递的参数 1 必须是 Entity 的实例,实例 ArrayCollection 给定)
CatchableFatalError to submit an embed form to persist entities (Argument 1 passed must be an instance of Entity, instance ArrayCollection given)
我的 symfony 项目中有一个 嵌入表单,用于持久化两个实体:Stockage.php
和 Equipements.php
。
这些实体之间的关系是 ManyToOne。
这是 Stockage.php
的代码:
class Stockage
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nameStockage", type="string", length=150, nullable=true)
*/
private $nameStockage;
/**
* @var Equipements
*
* @ORM\ManyToOne(targetEntity="Equipements", inversedBy="stockage", cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="equipements_id", referencedColumnName="id")
* })
*/
private $equipements;
/**
* Constructor
*/
public function __construct()
{
$this->equipements = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __toString()
{
return $this->nameStockage;
}
/* ... getters and setters for id and name */
/**
* Set equipements
*
* @param \MySpace\MyBundle\Entity\Equipements $equipements
* @return Stockage
*/
public function setEquipements(\MySpace\MyBundle\Entity\Equipements $equipements)
{
$this->equipements[] = $equipements;
return $this;
}
/**
* Get equipements
*
* @return \MySpace\MyBundle\Entity\Equipements
*/
public function getEquipements()
{
return $this->equipements;
}
}
这是 Equipements.php
的代码:
class 装备
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nameEquipement", type="string", length=150, nullable=false)
*/
private $nameEquipement;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="Stockage", mappedBy="equipements", cascade={"persist"})
*/
private $stockage;
/**
* Constructor
*/
public function __construct()
{
$this->stockage = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __toString()
{
return $this->nameEquipement;
}
/* ... getters and setters for id and nameEquipement */
/**
* Set stockage
*
* @param \MySpace\MyBundle\Entity\Stockage $stockage
*
* @return Equipements
*/
public function setStockage(\MySpace\MyBundle\Entity\Stockage $stockage = null)
{
$this->stockage = $stockage;
return $this;
}
/**
* Get stockage
*
* @return \MySpace\MyBundle\Entity\Stockage
*/
public function getStockage()
{
return $this->stockage;
}
public function addStockage(Stockage $stockage)
{
if (!$this->stockage->contains($stockage)) {
$this->stockage->add($stockage);
}
}
}
当我添加 Stockage 元素时,我可以添加 Equipement 元素,所以这是嵌入形式 StockageType.php:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nameStockage')
->add('equipements', 'collection', array(
'label' => false,
'type' => new EquipementsType(),
'allow_add' => true,
'by_reference' => false,
))
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MySpace\MyBundle\Entity\Stockage'
));
}
/**
* @return string
*/
public function getName()
{
return 'mySpace_myBundle_stockage';
}
当我提交我的表单时,出现了这个错误:
Argument 1 passed to MySpace/MyBundle/Entity/Stockage::setEquipements
must be an instance of MySpace\MyBundle\Entity\Equipements, instance
of Doctrine\Common\Collections\ArrayCollection given, called in
C:\wamp\www\MyApp\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php
on line 410 and defined',
'C:\wamp\www\MyApp\src\MySpace\MyBundle\Entity\Stockage.php',
'128', array('this' => object(Stockage))) in
src/MySpace/MyBundle/Entity/Stockage.php at line 128
Stockage.php
中的128行是这一行:public function setEquipements(\MySpace\MyBundle\Entity\Equipements $equipements)
有人可以帮忙吗? Symfony 需要有一个 return 的集合吧?
编辑
我有一个实体 Equipements.php
可能属于 一个 Stockage.php
或一个 Generator.php
但是一个设备 不能两者都。
因此,当我想添加设备时,如果设备是库存,我也需要添加 Stockage 的特殊性,或者如果设备是发电机,则需要添加发电机的特殊性。这就是为什么我必须在 StockageType.php
或 GeneratorType.php
.
中嵌入 EquipementType.php
(集合)
PS:我把这个问题解决了,请关注@Jean 评论以确保以正确的方式构建您的嵌入表单:如果您有 OneToOne关系遵循此 link,否则遵循如何构建和 return 带有集合的嵌入表单,如 @Jean 在他的评论和他的回答中建议的那样。
您必须修复 Equipements::setStockage()
方法,如下所示:
/**
* Set stockages
*
* @param ArrayCollection $stockage
*
* @return Equipements
*/
public function setStockages(ArrayCollection $stockage)
{
$this->stockage = $stockage;
return $this;
}
我的 symfony 项目中有一个 嵌入表单,用于持久化两个实体:Stockage.php
和 Equipements.php
。
这些实体之间的关系是 ManyToOne。
这是 Stockage.php
的代码:
class Stockage
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nameStockage", type="string", length=150, nullable=true)
*/
private $nameStockage;
/**
* @var Equipements
*
* @ORM\ManyToOne(targetEntity="Equipements", inversedBy="stockage", cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="equipements_id", referencedColumnName="id")
* })
*/
private $equipements;
/**
* Constructor
*/
public function __construct()
{
$this->equipements = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __toString()
{
return $this->nameStockage;
}
/* ... getters and setters for id and name */
/**
* Set equipements
*
* @param \MySpace\MyBundle\Entity\Equipements $equipements
* @return Stockage
*/
public function setEquipements(\MySpace\MyBundle\Entity\Equipements $equipements)
{
$this->equipements[] = $equipements;
return $this;
}
/**
* Get equipements
*
* @return \MySpace\MyBundle\Entity\Equipements
*/
public function getEquipements()
{
return $this->equipements;
}
}
这是 Equipements.php
的代码:
class 装备
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nameEquipement", type="string", length=150, nullable=false)
*/
private $nameEquipement;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="Stockage", mappedBy="equipements", cascade={"persist"})
*/
private $stockage;
/**
* Constructor
*/
public function __construct()
{
$this->stockage = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __toString()
{
return $this->nameEquipement;
}
/* ... getters and setters for id and nameEquipement */
/**
* Set stockage
*
* @param \MySpace\MyBundle\Entity\Stockage $stockage
*
* @return Equipements
*/
public function setStockage(\MySpace\MyBundle\Entity\Stockage $stockage = null)
{
$this->stockage = $stockage;
return $this;
}
/**
* Get stockage
*
* @return \MySpace\MyBundle\Entity\Stockage
*/
public function getStockage()
{
return $this->stockage;
}
public function addStockage(Stockage $stockage)
{
if (!$this->stockage->contains($stockage)) {
$this->stockage->add($stockage);
}
}
}
当我添加 Stockage 元素时,我可以添加 Equipement 元素,所以这是嵌入形式 StockageType.php:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nameStockage')
->add('equipements', 'collection', array(
'label' => false,
'type' => new EquipementsType(),
'allow_add' => true,
'by_reference' => false,
))
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MySpace\MyBundle\Entity\Stockage'
));
}
/**
* @return string
*/
public function getName()
{
return 'mySpace_myBundle_stockage';
}
当我提交我的表单时,出现了这个错误:
Argument 1 passed to MySpace/MyBundle/Entity/Stockage::setEquipements must be an instance of MySpace\MyBundle\Entity\Equipements, instance of Doctrine\Common\Collections\ArrayCollection given, called in C:\wamp\www\MyApp\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php on line 410 and defined', 'C:\wamp\www\MyApp\src\MySpace\MyBundle\Entity\Stockage.php', '128', array('this' => object(Stockage))) in src/MySpace/MyBundle/Entity/Stockage.php at line 128
Stockage.php
中的128行是这一行:public function setEquipements(\MySpace\MyBundle\Entity\Equipements $equipements)
有人可以帮忙吗? Symfony 需要有一个 return 的集合吧?
编辑
我有一个实体 Equipements.php
可能属于 一个 Stockage.php
或一个 Generator.php
但是一个设备 不能两者都。
因此,当我想添加设备时,如果设备是库存,我也需要添加 Stockage 的特殊性,或者如果设备是发电机,则需要添加发电机的特殊性。这就是为什么我必须在 StockageType.php
或 GeneratorType.php
.
EquipementType.php
(集合)
PS:我把这个问题解决了,请关注@Jean 评论以确保以正确的方式构建您的嵌入表单:如果您有 OneToOne关系遵循此 link,否则遵循如何构建和 return 带有集合的嵌入表单,如 @Jean 在他的评论和他的回答中建议的那样。
您必须修复 Equipements::setStockage()
方法,如下所示:
/**
* Set stockages
*
* @param ArrayCollection $stockage
*
* @return Equipements
*/
public function setStockages(ArrayCollection $stockage)
{
$this->stockage = $stockage;
return $this;
}