Php Symfony2持久嵌入形式

Php Symfony2持久嵌入形式,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我正在学习如何嵌入表单集合。 我试图用多个休战来维持一台机器 这是我的密码: 机器实体 Truc实体 机器类型 卡车类型 表单(我不发布javascript部分) {%extends”::layout.html.twig“%} 当我试图持久化我的实体时,我有以下错误 可捕获的致命错误:传递给Tmp\TestBundle\Entity\Machin::setTrucs()的参数1必须是Doctrine\Common\Collections\ArrayCollection的实例,数组给定 我

我正在学习如何嵌入表单集合。 我试图用多个休战来维持一台机器

这是我的密码:

机器实体

Truc实体

机器类型

卡车类型

表单(我不发布javascript部分)

{%extends”::layout.html.twig“%}

当我试图持久化我的实体时,我有以下错误

可捕获的致命错误:传递给Tmp\TestBundle\Entity\Machin::setTrucs()的参数1必须是Doctrine\Common\Collections\ArrayCollection的实例,数组给定


我不知道我在哪里漏掉了什么,有什么帮助吗?

您可能需要大量复制/粘贴示例。
您必须将
Machin
构造函数更改为:

public function __construct()
{
    $this->trucs = new ArrayCollection();

    //This was wrong:
    //$this->tags = new ArrayCollection();
}

还要注意的是,在
MachineType
类中,您不需要使用
'prototype'=>true
,因为它默认为该值:

将代码显示给第三方总是很好的。。。谢谢你的关注。我现在在trucs->addMachin不存在上有一个错误,我想我应该在我的Truc实体代码中添加相同的反向逻辑,对吗?嗯,您可能在
Truc
类中缺少
$machins
ArrayCollection
。您使用的是多对多单向吗?
namespace Tmp\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Truc
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Truc
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Truc
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    public function addMachin(Machin $machin)
    {
        if (!$this->machins->contains($machin)) {
        $this->machins->add($machin);
        }
    }
}
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class MachinType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');

        $builder->add('trucs', 'collection', array(
            'type' => new TrucType(),
            'allow_add' => true,
            'by_reference' => false,
            'prototype' => true));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Tmp\TestBundle\Entity\Machin',
        ));
    }

    public function getName()
    {
        return 'machin';
    }
}
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TrucType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Tmp\TestBundle\Entity\Truc',
        ));
    }
    public function getDefaultOptions(array $options)
    {
    return array(
    'data_class' => 'Tmp\TestBundle\Entity\Truc',
    );
}

    public function getName()
    {
        return 'truc';
    }
}
{% block content %}

<form  method="POST" {{ form_enctype(form) }}>
    {# affiche l'unique champ de la tâche : description #}
    {{ form_row(form.name) }}

    <ul class="trucs" data-prototype="{{ form_widget(form.trucs.vars.prototype)|e }}">
        {# itère sur chaque truc existant et affiche son unique champ : name #}
        {% for truc in form.trucs %}
            <li>{{ form_row(truc.name) }}</li>
        {% endfor %}
    </ul>

    {{ form_rest(form) }}
    <input type="submit" class="btn btn-primary"/>
</form>
namespace Tmp\TestBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Tmp\TestBundle\Entity\Machin;
use Tmp\TestBundle\Form\Type\MachinType;


class DefaultController extends Controller
{
    public function indexAction($name)
    {
        return $this->render('TmpTestBundle:Default:index.html.twig', array('name' => $name));
    }
    public function newAction(){
        $em = $this->getDoctrine()->getManager();
        $machin = new Machin();
        $form = $this->createForm(new MachinType(),$machin);
        $request = $this->get('request');
        if ($request->isMethod('POST')) {

              $form->bindRequest($request);
               //if ($form->isValid()) {

                $em->persist($machin);
                $em->flush();
                 return $this->redirect($this->generateUrl('tmp_list'));
               //}
           }else{

           }
        return $this->render('TmpTestBundle:Default:new.html.twig',array('form' => $form->createView()));
    }
    public function listAction(){
        $em = $this->getDoctrine()->getManager();

        $machin = $em->getRepository("TmpTestBundle:Machin")->findAll();
        return $this->render('TmpTestBundle:Default:list.html.twig',array('machins' => $machin));
    }
}
public function __construct()
{
    $this->trucs = new ArrayCollection();

    //This was wrong:
    //$this->tags = new ArrayCollection();
}