Symfony2:表单的视图数据应该是实体的实例,但是是数组

时间:2016-10-20 10:56:40

标签: forms symfony doctrine-orm symfony-forms symfony2-forms

有两个使用相同表单的操作(新建和编辑)。表单应创建一个新实体(MyBundle \ Entity \ Project)或编辑现有实体。每个项目都可以分配给一个团队(MyBundle \ Entity \ Team),一个团队可以拥有多个项目。

实体/ Project.php:

/* ... */
/**
     * @var Team
     *
     * @ORM\ManyToOne(targetEntity="Team", inversedBy="projects")
     * @ORM\JoinColumn(name="team", referencedColumnName="id")
     */
    private $team;
/* ... */

实体/ Team.php:

/* ... */
/**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Project", mappedBy="team")
     * @ORM\OrderBy({"title" = "ASC"})
     **/
    private $projects;
/* ... */

控制器/ ProjectController.php:

public function newAction()
    {
        $project = new Project();
        $form = $this->createForm(
            new new ProjectType($project),
            array(
                'action' => $this->generateUrl('mybundle_project_create'),
            )
        );

        /* ... */
    }

public function editAction($id, Request $request)
    {
        /** @var \Doctrine\ORM\EntityManager $em */
        $em = $this->getDoctrine()->getManager();
        $project = $em->getRepository('MyBundle:Project')->findOneById($id);

        $form = $this->createForm(
            new ProjectType($project),
            $project,
            array(
                'action' => $this->generateUrl('mybundle_project_edit', array('id' => $project->getId())),
            )
        );

窗体/ ProjectType.php:

private $project;

    public function __construct($project = null)
    {
        $this->project = $project;
    }

/**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            /* ... */
            ->add('team', 'entity', array(
                'class' => MyBundle:Team',
                'property' => 'name',
                'label' => 'Team',
                'query_builder' => function (TeamRepository $er) {
                    return $er->createQueryBuilder('e')
                        ->orderBy('e.name', 'ASC');
                },
                'expanded' => false,
                'multiple' => false,
                'required' => false
            ))
            ->add('save', 'submit');
    }

/**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(
            array(
                'data_class' => 'MyBundle\Entity\Project',
            )
        );
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'mybundle_project';
    }

当我访问编辑表单时,下拉列表会正确显示已分配的团队。但是当我尝试创建一个新项目时,它会给我以下错误消息:

  

表单的视图数据应该是类的实例   MyBundle \ Entity \ Project,但是是一个(n)数组。你可以避免   将“data_class”选项设置为null或添加一个   查看将(n)数组转换为实例的转换器   MyBundle \实体\项目。

1 个答案:

答案 0 :(得分:1)

ProjectController的newAction使用2个参数而不是3来调用方法createForm,它应该是

$form = $this->createForm(
    new ProjectType($project),
    $project,
    array(
        'action' => $this->generateUrl('mybundle_project_create'),
    )
);

而不是

$form = $this->createForm(
    new ProjectType($this->getDoctrine()->getEntityManager(), $project),
    array(
        'action' => $this->generateUrl('mybundle_project_create'),
    )
);