CatchableFatalError将embed表单提交给持久化实体(传递的参数1必须是Entity的实例,给定的实例ArrayCollection)

时间:2015-04-23 10:28:36

标签: php forms symfony collections doctrine-orm

我的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的代码: 班级设备

{
    /**
     * @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';
}

当我提交表单时,我有错误

  

参数1传递给MySpace / MyBundle / Entity / Stockage :: setEquipements   必须是MySpace \ MyBundle \ Entity \ Equipements实例的实例   给出的Doctrine \ Common \ Collections \ ArrayCollection,调用   C:\瓦帕\ WWW \ MyApp的\厂商\ symfony的\ symfony的\ SRC \的Symfony \元器件\ PropertyAccess \ PropertyAccessor.php   在第410行并定义',   'C:\ WAMP \ WWW \ MyApp的\ SRC \ MySpace的\ MyBundle \实体\ Stockage.php',   '128',数组('this'=>对象(Stockage)))in   第128行的src / MySpace / MyBundle / Entity / Stockage.php

Stockage.php中的 128 行是这一行:public function setEquipements(\MySpace\MyBundle\Entity\Equipements $equipements)

有人可以帮忙吗? Symfony需要回收一个集合吗?

修改

我有一个实体Equipements.php,可以属于 一个Stockage.phpGenerator.php但设备不能同时enter image description here

因此,当我想添加一个设备时,如果设备是一个库存,我需要添加Stockage的特性,或者如果设备是一个发电机,则需要添加发电机的特性。这就是为什么我必须在EquipementType.phpStockageType.php中嵌入GeneratorType.php(集合)。

PS:我把这个问题解决了,请关注@Jean评论以确保以正确的方式构建您的嵌入表单:如果您有OneToOne关系,请关注此link,否则跟随如何构建和返回一个嵌入式表单,其中包含@Jean等集合,并在他的演讲和答案中提出。

1 个答案:

答案 0 :(得分:1)

您必须修复Equipements::setStockage()方法,如下所示:

/**
 * Set stockages
 *
 * @param ArrayCollection $stockage
 *
 * @return Equipements
 */
public function setStockages(ArrayCollection $stockage)
{
    $this->stockage = $stockage;

    return $this;
}