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.phpEquipements.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.phpGeneratorType.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;
}