2016-10-20 21 views
0

有两种操作(新建和编辑)使用相同的表单。表单将创建一个新实体(MyBundle \ Entity \ Project)或编辑一个现有的实体。每个项目可以分配给一个团队(MyBundle \ Entity \ Team),一个团队可以拥有多个项目。Symfony2:表单的视图数据预计是实体的一个实例,但是是数组

实体/ 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 \实体\项目的实例,但它是一个(N )数组。您可以通过将“data_class”选项设置为null或通过添加将(n)数组转换为 MyBundle \ Entity \ Project实例的视图转换器来避免 此错误。

回答

1

ProjectController的newAction调用此方法createForm有两个参数,而不是3,它应该是

$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'), 
    ) 
); 
+0

这并没有做的工作,同样的错误消息之前。请参阅编辑的问题。 – cnmicha

+0

>用2个参数代替3 @gamboa我只能看到1个参数($ project) – cnmicha

+0

我的不好,我实在太笨了。谢谢! – cnmicha

相关问题